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 の場合、最初の要素を繰り返すだけです。それ以外の場合は、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)

しかし、 using すると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?
4

3 に答える 3

9
(fn [x] x)

この特定の公案を解決します

于 2013-11-25T12:37:59.867 に答える
5

次のドキュメントを読み直してくださいiterate

x、(fx)、(f(fx))などの遅延シーケンスを返します。

特定の反復の結果が必要な場合は、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)
于 2012-09-08T09:44:20.050 に答える