我可以安全地假设当
(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 , reduce和 count也是非惰性的,因为它们需要消耗整个输入序列。因此,每当您使用这些函数时,您的整个序列都会被实现,并且您将失去惰性的好处。
如果您想要在 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/