我正在阅读Programming Clojure现在我找出下一个例子
(defn by-pairs [coll]
(let
[take-pair (fn [c] (when (next c) (take 2 c)))]
(lazy-seq
(when-let [pair (seq (take-pair coll))] ;seq calls here
(cons pair (by-pairs (rest coll)))))))
它将列表分成对,例如
(println (by-pairs [1 2 1])) ((1 2) (2 1))
(println (by-pairs [1 2 1 3])) ((1 2) (2 1) (1 3))
(println (by-pairs [])) ()
(println (by-pairs [1])) ()
我不明白的是为什么我们应该对 take-pair 结果调用 seq?那么为什么我们不能只写
(defn by-pairs [coll]
(let
[take-pair (fn [c] (when (next c) (take 2 c)))]
(lazy-seq
(when-let [pair (take-pair coll)]
(cons pair (by-pairs (rest coll)))))))
在任何情况下都会有不同的结果或者是否有任何性能原因?
最佳答案
两个代码都是相同的,没有区别,因为 next
和 take
函数在 take-pair
中应用于 coll函数,请在传递的参数上调用 seq
,即 next c
将首先在 c 上调用 seq
或尝试检查它是否是实现了ISeq
与 take
函数执行的操作相同。因此,基本上在这种情况下,如果您自己不调用 seq
,则 next
和 take
将调用 seq
on它。
关于clojure - 当我应该从惰性序列中创建序列时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594282/