9

LazySeq があるとしましょう

(def s (take 10 (iterate + 0)))

(count s)シーケンスを認識していますか?

4

3 に答える 3

6

遅延シーケンスについてお尋ねの場合は、はい。

user> (def s (map #(do (println "doing work") %) (range 4)))
#'user/s
user> (count s)
doing work
doing work
doing work                       
doing work
4  

一部のデータ構造は一定時間で答えを出すことができますが、遅延シーケンスにはカウントが保存されておらず、カウントは常にそれらを実現します

于 2013-09-10T21:24:40.200 に答える
1

遅延シーケンスの定義に依存します。要素を認識せずに長さを知っているものを実装することは可能です。例についてはこの質問を参照してください。ただし、99% の場合、それらは単なる LazySeq であるため、Michiel の回答でそれをカバーする必要があります。

あなたの例では、次のように簡単にテストできます。

(realized? s) 

trueを呼び出した後に戻る(count s)ため、s内容に気付かずに長さを知るほど「賢い」わけではありません。

于 2013-09-10T21:22:20.040 に答える