我正在研究Clojure Koans:
https://github.com/functional-koans/clojure-koans/blob/master/src/koans/10_lazy_sequences.clj
我被困在这一个:
"Iteration can be used for repetition"
(= (repeat 100 :foo)
(take 100 (iterate ___ :foo)))
我不知道填充 _ 空白的确切内置函数,所以我尝试编写自己的函数。我把它写成一个单独的函数作为测试。
我打算这样做:如果x是seq,那么只需重复它的第一个元素。否则,请将其设为seq。
(def f (fn [x] (if (seq? x) (cons (first x) x) (cons x '()))))
当我明确地运行它时,它看起来很好:
user=> (f :abc)
(:abc)
user=> (f (f :abc))
(:abc :abc)
user=> (f (f (f :abc)))
(:abc :abc :abc)
但是使用iterate
会增加一个额外的括号:
user=> (take 1 (iterate f :abc))(:abc)
user=> (take 2 (iterate f :abc))
(:abc (:abc))
user=> (take 3 (iterate f :abc))
(:abc (:abc) (:abc :abc))
What causes this?
答案 0 :(得分:9)
(fn [x] x)
解决这个特殊的公案
答案 1 :(得分:5)
重新阅读iterate
的{{3}}:
返回x,(f x),(f(f x))等的延迟序列。
如果您想要特定迭代的结果,请使用nth
代替take
:
user=> (nth (iterate f :abc) 0) :abc user=> (nth (iterate f :abc) 1) (:abc) user=> (nth (iterate f :abc) 2) (:abc :abc) user=> (nth (iterate f :abc) 3) (:abc :abc :abc)
答案 2 :(得分:2)
我用#(keyword %)
我尝试使用#( %)
,但它不起作用。谁知道为什么?