我在想Haskell中的列表,并且我认为在其他语言中,一个不使用列表的一切。当然,如果你以后需要这些值,你可能想要存储一个列表,但是如果它只是一次性的,比如从[1..n]
开始迭代,为什么使用一个列表,其中真正需要的变量是一个增加的变量?管道,替换列表?
我还阅读了关于“列表融合”的内容,并指出尽管Haskell编译器试图实现这种优化以消除中间列表,但它们往往不成功,导致垃圾收集器不得不清理仅被使用一次的列表。
另外,如果你不小心一个可以轻松地共享一个列表,这意味着垃圾收集不清理,这可能会导致与以前的设计在不断运行的算法运行内存空间。
所以我认为这将是最好的,以避免完全名单,至少在一个实际上并不想“商店”名单。
我然后在conduit
来了,它是说:
解决数据流的问题,允许生产, 改造,并在不断的 存储器中的数据流的消费。
这听起来很不错。我知道conduit
是专为IO
资源获取和发布问题的问题而设计的,但是可以将它用作替代列表的替代品吗?
例如,我可以做到以下几点:
fold f3 $ take 10 $ map f2 $ unfold f1 init_value
而且有一些适当放置类型标注,使用管道的整个过程,而不是名单?
我希望或许classy-prelude
会允许这样的代码,但我不知道。如果有可能,有人可以举一个例子,像上面这样说吗?
你对名单的直觉是不正确的,我想,你也可以忘记了懒惰的评价,当你谈论“存储”一名单。在任何情况下,“管道”正在解决的问题都是懒惰IO提出的问题。也看看'vector'软件包。 – jberryman