【发布时间】:2015-02-19 20:22:34
【问题描述】:
我已经实现了一个惰性素数生成器(nextprime 返回从传递的数字开始的下一个素数):
(defn allprimes
([] (allprimes 2))
([x] (lazy-seq (cons (nextprime x) (allprimes (nextprime x))))))
假设 nextprime 是一个代价高昂的函数,为了不执行两次,我尝试将它绑定到一个符号:
(defn allprimes
([] (allprimes 2))
([x] (let [next (nextprime x)]
(cons next (lazy-seq (allprimes (next)))))))
但这不起作用(java.lang.Long 不能转换为 clojure.lang.IFn)。为什么?
另外,(cons n (lazy-seq ...)) 和 (lazy-seq (cons n ...)) 有什么区别吗?
编辑:感谢 Kyle 在第一个问题中指出错误。如果括号从 next 中删除,它可以工作。
【问题讨论】:
-
next在函数位置。尝试删除括号 -(allprimes next) -
谢谢,第一个问题已经结束了……我觉得好傻!
-
还可以看看
iterate,它为你构造了一个惰性序列——(def allprimes (iterate nextprime 2)) -
反正应该是
(cons x (allprimes (nextprime x))),不需要let。
标签: clojure lazy-evaluation primes seq