非遅延シーケンスのクラスが返されることを期待して、Clojureで次のことを試しました。
(.getClass (doall (take 3 (repeatedly rand))))
ただし、これはまだ を返しますclojure.lang.LazySeq
。私の推測ではdoall
、シーケンス全体を評価しますが、元のシーケンスはメモ化に役立つため、元のシーケンスを返します。
では、遅延シーケンスから非遅延シーケンスを作成する慣用的な手段は何ですか?
非遅延シーケンスのクラスが返されることを期待して、Clojureで次のことを試しました。
(.getClass (doall (take 3 (repeatedly rand))))
ただし、これはまだ を返しますclojure.lang.LazySeq
。私の推測ではdoall
、シーケンス全体を評価しますが、元のシーケンスはメモ化に役立つため、元のシーケンスを返します。
では、遅延シーケンスから非遅延シーケンスを作成する慣用的な手段は何ですか?
doall
は、あなたが必要とすることすべてです。seq
hasタイプであるからといって、LazySeq
評価が保留されているとは限りません。レイジーseq
は結果をキャッシュするので、すべてを強制するためにレイジーseq
を1回(実行するように)歩くだけで、レイジーではなくなります。コレクション全体を強制的に評価することはありません。doall
seq
これはある程度、分類学の問題です。遅延シーケンスは、リスト、ベクター、またはマップと同様に、シーケンスの 1 つのタイプにすぎません。したがって、答えはもちろん「取得したい非遅延シーケンスのタイプによって異なります。以下
から選択してください。
(doall ... )
(apply list (my-lazy-seq)) OR (into () ...)
(vec (my-lazy-seq))
ニーズに最も適したタイプのシーケンスを使用できます。
この金持ちの男は自分のクロージュアを知っているようで、絶対に正しい。
しかし、あなたの例を使用したこのコードスニペットは、この質問を補完するのに役立つと思います:
=> (realized? (take 3 (repeatedly rand)))
false
=> (realized? (doall (take 3 (repeatedly rand))))
true
確かにタイプは変わっていませんが、実現は変わっています
(.getClass (into '() (take 3 (repeatedly rand))))