clojure - 当我应该从惰性序列中创建序列时

标签 clojure

我正在阅读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)))))))

在任何情况下都会有不同的结果或者是否有任何性能原因?

最佳答案

两个代码都是相同的,没有区别,因为 nexttake 函数在 take-pair 中应用于 coll函数,请在传递的参数上调用 seq ,即 next c 将首先在 c 上调用 seq 或尝试检查它是否是实现了ISeqtake 函数执行的操作相同。因此,基本上在这种情况下,如果您自己不调用 seq,则 nexttake 将调用 seq on它。

关于clojure - 当我应该从惰性序列中创建序列时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11594282/

相关文章:

clojure - 合并两个映射列表,其中条目由 Clojure 中的 id 标识

Java 8,用于 Mac OS X 上的 IntelliJ

clojure - 如何将 Clojure 命名空间转换为字符串?

clojure - 如何撤消或撤销 datomic 中的事务?

clojure - 基座提前终止不起作用

Clojure 中的单元测试副作用

Clojure - (读取字符串字符串调用函数

dictionary - 为什么在 Clojure 的 transient 映射中插入 1000 000 个值会生成一个包含 8 个项目的映射?

c# - 权限不足 - 如何检查命令期望的权限?

recursion - Clojure - 从循环内的向量中删除项目