1. ホーム
  2. clojure

[解決済み] Clojureで遅延シーケンスを非遅延シーケンスに変換する方法

2023-01-10 17:47:40

質問

Clojureで、レイジーでないシーケンスのクラスが返されることを期待して、以下を試しました。

(.getClass (doall (take 3 (repeatedly rand))))

しかし、これはまだ clojure.lang.LazySeq . 私の推測では doall はシーケンス全体を評価しますが、メモ化のためにまだ有用であるため、元のシーケンスを返します。

では、遅延シーケンスから非遅延シーケンスを作成するイディオム的な手段は何でしょうか?

どのように解決するのですか?

doall があればいいのです。ただ、その seq が型を持っているからと言って LazySeq は評価待ちであることを意味しません。のんびりした seq はその結果をキャッシュするので、あなたがする必要があるのは、遅延 seq を一度歩くだけです。 doall のように)一度だけ実行することで、すべてを強制し、怠惰でないようにします。 seq ではない は、コレクション全体を評価するよう強制します。