Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 我应该在什么时候从惰性序列生成序列_Clojure - Fatal编程技术网

Clojure 我应该在什么时候从惰性序列生成序列

Clojure 我应该在什么时候从惰性序列生成序列,clojure,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-pa

我现在正在阅读,我发现了下一个例子

(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
函数应用于coll In
take pair
函数,对传递的参数调用
seq
,即
next c
将首先对c调用
seq
,或者尝试检查它是否是实现
ISeq
的对象,以及
take
函数正在执行的操作。因此,基本上在这种情况下,如果您自己不调用
seq
,那么
next
take
将调用
seq