2

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

我不明白的是为什么我们应该在配对结果上调用 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)))))))

在女巫情况下会有不同的结果还是有任何性能原因?

4

1 回答 1

2

两个代码都是相同的,不会有任何区别,因为next函数take中应用于 coll 的take-pair函数,seq对传递的参数进行调用,即next c首先调用seqc 或尝试检查它是否是一个实现ISeq且相同的对象按take功能做。所以基本上在这种情况下,如果你不给seq自己打电话,nextandtake会打电话seq给它。

于 2012-07-21T17:46:31.600 回答