私は Haskell のリストについて考えていましたが、他の言語では、すべてにリストを使用するわけではないと考えました。確かに、後で値が必要な場合はリストを保存したいかもしれませんが、それが 1 回限りの場合、たとえば から反復する[1..n]
場合、実際に必要なのはインクリメントされる変数だけであるリストを使用する必要はありません。
また、「リストの融合」について読んだところ、Haskell コンパイラはこの最適化を実装して中間リストを排除しようとしますが、しばしば失敗し、ガベージ コレクターが 1 回しか使用されないリストをクリーンアップする必要があることに気付きました。
また、注意を怠ると、リストを簡単に共有できます。つまり、ガベージ コレクターがリストをクリーンアップしないため、以前は定数空間で実行するように設計されていたアルゴリズムでメモリが不足する可能性があります。
したがって、少なくともリストを実際に「保存」したくない場合は、リストを完全に避けるのが最善だと思いました。
その後、次のようconduit
に書かれている に出会いました。
ストリーミング データの問題を解決し、コンスタント メモリ内のデータ ストリームの生成、変換、および消費を可能にします。
これは完璧に聞こえました。リソースの取得と解放の問題conduit
のために設計されていることは知っていますが、リストの代わりにドロップインとして使用できますか?IO
たとえば、次のことができますか。
fold f3 $ take 10 $ map f2 $ unfold f1 init_value
そして、適切に配置されたいくつかの型注釈を使用して、リストの代わりにプロセス全体にコンジットを使用しますか?
おそらくそのclassy-prelude
ようなコードが許可されることを望んでいましたが、よくわかりません。可能であれば、誰かが上記のように例を挙げてもらえますか?