clojure - 是否假设惰性序列?

标签 clojure

我可以安全地假设当

(gen-sym-map (gen-acct-num-sym @sym-count (gen-acct-nums 10)) 100.00)

已执行 我有一个惰性序列,或者 gen-sym-map 应该在惰性序列函数调用中返回结果映射吗?

(defn gen-acct-nums [range-end-idx]
    (vec (range 10000 (+ 10000  range-end-idx 1))))

(defn random-acct-num [acct-nums]
    (nth acct-nums (.nextInt random (count acct-nums))))

(defn gen-acct-num-sym [num-syms acct-nums]
    (loop [snum num-syms acct-num-lis []]
        (if (= snum 0)
                acct-num-lis
                (recur (dec snum) (conj acct-num-lis (random-acct-num acct-nums))))))

(defn gen-sym-map-day [acct-nums starting-bal]
    (reduce
        (fn [sym-map one-acct-num]
            (let [trans (random-trans )
                  amt   (random-amount )]
                (conj sym-map { one-acct-num (vector trans amt starting-bal) } )))
        {}
        acct-nums))

(defn gen-sym-map [acct-nums starting-bal]
    (loop [day-count-left @sym-day-count current-day 1 sym-map-local  {}]
        (if (= day-count-left 0)
            sym-map-local
            (recur (dec day-count-left) (inc current-day)
                    (conj sym-map-local {(gen-map-key current-day)
                                    (gen-sym-map-day acct-nums starting-bal)} )))))

最佳答案

在这种情况下,您不会得到惰性序列。

这有多种原因:

  • 您正在构建 map 。 map 并不懒惰,只有序列才懒惰。
  • 您的大多数函数都是使用循环/递归编写的,它们本质上是命令式且非惰性的。
  • 还值得注意的是 vec , reducecount也是非惰性的,因为它们需要消耗整个输入序列。因此,每当您使用这些函数时,您的整个序列都会被实现,并且您将失去惰性的好处。

如果您想要在 Clojure 中使用惰性序列,最简单的方法通常是根据产生诸如 map 之类的序列的高阶函数编写代码。和 filter 。大多数序列生成函数默认创建惰性序列。

您当然可以将内容包装在 lazy-seq 中如果你想构造一个惰性序列,但这需要以下内容:

  • 您的输出必须采用序列的形式
  • 您有一种方法可以在不实现完整结果的情况下延迟构建输出(否则使用lazy-seq毫无意义......)

lazy-seq 的经典用法是使用一些高阶函数和递归来定义一个(可能是无限的)惰性序列,例如如下:

(def fibs (concat [1 2] (lazy-seq (map + fibs (next fibs))))) 

关于clojure - 是否假设惰性序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8553127/

相关文章:

sqlite - 在 Clojure 中通过 clojure.java.jdbc 使用外键约束

clojure - 从 Clojure 向量原子中删除第一项并将其返回

clojure - 如何使用 Clojure 的 distinct?集合上的函数?

clojure - 用 :gen-class a class that exposes its naked fields 扩展

matrix - 将行/列添加到 core.matrix (Clojure) 中的现有矩阵

syntax - 为什么 Clojure 语言使用这么多括号?

clojure - core.async 管道中并行参数的含义和目的是什么?

clojure - 使用enlive提取连续的html片段

ClojureScript 参数声明错误

Clojure 整数溢出