9

我正在研究 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。

(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)

但是 usingiterate添加了一个额外的括号:

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?
4

3 回答 3

9
(fn [x] x)

解决了这个特殊的公案

于 2013-11-25T12:37:59.867 回答
5

重新阅读文档iterate

返回 x、(fx)、(f (fx)) 等的惰性序列。

如果您想要特定迭代的结果,请使用nth而不是:take

用户=> (nth (迭代 f :abc) 0)
:abc
用户=> (nth (迭代 f :abc) 1)
(:abc)
用户=> (nth (迭代 f :abc) 2)
(:abc:abc)
用户=> (nth (迭代 f :abc) 3)
(:abc :abc :abc)
于 2012-09-08T09:44:20.050 回答
2

我已经解决了#(keyword %)

我试过了,#( %)但它不起作用。有谁知道为什么?

于 2015-01-02T19:56:14.593 回答