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函数如果只包含lazy函数,那么它也会调用lazy函数吗?_Clojure_Functional Programming_Lazy Evaluation - Fatal编程技术网

为什么不是';一个Clojure函数如果只包含lazy函数,那么它也会调用lazy函数吗?

为什么不是';一个Clojure函数如果只包含lazy函数,那么它也会调用lazy函数吗?,clojure,functional-programming,lazy-evaluation,Clojure,Functional Programming,Lazy Evaluation,Clojure函数 (reductions + 0 (cycle [1 1 -1])) 生成一个序列[0 1 2 1 2 3 3 4 4 5…]。不幸的是,这个序列不是懒惰的 由于和都被记录为返回惰性序列,我希望这些函数的组合也会返回惰性序列。为什么它不能,我如何修复它以懒洋洋地返回序列 显示相同问题的更复杂示例: (reductions (fn [x f] (f x)) 0 (cycle [inc inc dec])) (我展示了这一点,因为这是我希望最终能够实现的版本,以防有任何不同)

Clojure函数

(reductions + 0 (cycle [1 1 -1]))
生成一个序列[0 1 2 1 2 3 3 4 4 5…]。不幸的是,这个序列不是懒惰的

由于和都被记录为返回惰性序列,我希望这些函数的组合也会返回惰性序列。为什么它不能,我如何修复它以懒洋洋地返回序列

显示相同问题的更复杂示例:

(reductions (fn [x f] (f x)) 0 (cycle [inc inc dec]))
(我展示了这一点,因为这是我希望最终能够实现的版本,以防有任何不同)

不幸的是,这个序列不是懒惰的

哦,是的,是的。我们可以通过获取它的前10个元素来快速检查它是否懒惰:

(take 10 (reductions + 0 (cycle [1 1 -1])))
这会很快返回一个答案,这证明序列是惰性的。如果函数不是懒惰的,它将尝试实现无限序列中的所有元素,并将耗尽内存,或者挂起在无限循环中

发生的情况是,您在REPL中键入这个func,它会在向您显示之前尝试实现该序列


编辑:如果您发现自己触发了一个或无意中尝试实现一个无限序列,请使用此提示

谢谢:)。我试着用(def…)声明对序列进行别名处理以防止出现这种情况,但当然(我现在意识到)这不起作用。用一个(defn…)命名就可以了。检查函数是否懒惰的一个更准确的方法是将它包装在realized?中。如果返回false,则函数是惰性的。=>(已实现?(减少+0(周期[11-1]))false
已实现?
在这方面效果很差(事实上,在大多数情况下;希望很快得到改善)。尝试所有这些值:
[]
nil
'(a b c)
(iterate inc 0)
,你就会明白我的意思了。