(デフS(10(反復+ 0))を取る)`count`はClojureでレイジーシーケンスを実現していますか?
(count s)
はシーケンスを実現していますか?のは、私がLazySeq
を持っているとしましょうか
(デフS(10(反復+ 0))を取る)`count`はClojureでレイジーシーケンスを実現していますか?
(count s)
はシーケンスを実現していますか?のは、私がLazySeq
を持っているとしましょうか
レイジーシーケンスについて質問している場合は、はいです。
user> (def s (map #(do (println "doing work") %) (range 4)))
#'user/s
user> (count s)
doing work
doing work
doing work
doing work
4
怠惰なシーケンスが格納されたカウントを持っていませんが、データ構造のいくつかは、あなたに一定の時間内に答えを与えることができ、かつカウントは常に彼らにを実現。
レイジーシーケンスの定義に依存します。要素を認識せずに長さを知っているものを実装することは可能です。例についてはthis questionを参照してください。しかし、99%のケースでは、LazySeqsなので、Michielの答えでそれをカバーする必要があります。
あなたの例の場合、それはテストするのは簡単です、のように:
(realized? s)
戻りtrue
(count s)
を呼び出した後、そのs
は、それはそれの内容を実現することなく長さを知っているのに十分な「賢い」ではありません。
ああ私は「実現した」とは知らなかった。ありがとう! – al3x
LazySeqはいの場合、カウント方法hereが表示されます。それは、すべての要素を頭から尾まで歩きます。
最初に行う必要はありません –
おっと、ありがとうございます。一定。 –