【发布时间】:2017-08-30 21:33:46
【问题描述】:
我正在尝试解决 4Clojure 问题(序列减少),但我遇到了困难。问题是重新实现reductions函数。
在我看来,这个函数应该返回一个惰性序列,但它不会 - 评估 (take 5 (redux + (range))) 会导致无限循环。
这是我的代码:
(defn redux
([f coll]
(redux f (first coll) (rest coll)))
([f val coll]
((fn red [val coll s]
(if (empty? coll)
s
(lazy-seq
(let [val (f val (first coll))]
(red val
(rest coll)
(conj s val))))))
val coll [val])))
为什么这个函数没有返回惰性序列?
【问题讨论】:
-
我没有时间完整回答,但是看看你的代码,问问自己,一个元素实际上是什么时候被添加到某个地方的?你会注意到它不是。这只是一系列调用
red的thunk (lazy-seq) ...如果你有lazy-seq,你的代码中可能应该有cons,一般来说,因为这实际上创建了列表。