我在考虑 Haskell 中的列表,我认为在其他语言中,不会对所有内容都使用列表。当然,如果您稍后需要这些值,您可能想要存储一个列表,但如果它只是一个关闭,比如说从 迭代[1..n]
,为什么要使用一个真正需要的只是一个递增变量的列表?
我还阅读了有关“列表融合”的内容,并注意到虽然 Haskell 编译器尝试实现这种优化以消除中间列表,但它们通常不成功,导致垃圾收集器不得不清理只使用一次的列表。
此外,如果您不小心,很容易共享一个列表,这意味着垃圾收集器不会清理它,这可能导致内存不足,而以前设计为在恒定空间中运行的算法。
所以我认为最好完全避免列表,至少当一个人实际上不想“存储”列表时。
然后我遇到了conduit
,上面写着:
流数据问题的解决方案,允许在恒定内存中生产、转换和消费数据流。
这听起来很完美。我知道conduit
它是为IO
资源获取和释放问题而设计的,但是可以将它用作列表的替代品吗?
例如,我可以执行以下操作:
fold f3 $ take 10 $ map f2 $ unfold f1 init_value
并且通过一些适当放置的类型注释,在整个过程中使用管道而不是列表?
我希望这可能classy-prelude
会允许这样的代码,但我不确定。如果可能的话,有人可以举个例子,像上面说的那样吗?