【发布时间】:2014-10-19 08:13:26
【问题描述】:
引用@dfeuer 对这个问题的回答:Least expensive way to construct cyclic list in Haskell,它表示使用循环列表“击败”垃圾收集器,因为它必须保留您从分配的循环列表中消耗的所有内容,直到您放弃对任何缺点的引用列表中的单元格。
显然,在 Haskell 中,循环列表和无限列表是两个不同的东西。这个博客(https://unspecified.wordpress.com/2010/03/30/a-doubly-linked-list-in-haskell/)说如果你实现cycle如下:
cycle xs = xs ++ cycle xs
它是一个无限列表,而不是循环列表。要使其循环,您必须像这样实现它(在 Prelude 源代码中可以找到):
cycle xs = xs' where xs' = xs ++ xs'
这两种实现之间究竟有什么区别?为什么如果你在循环列表的某个地方持有一个 cons 单元,垃圾收集器必须在分配之前保留所有内容?
【问题讨论】:
-
和其他语言完全一样...
-
我误读并期待一个关于骑自行车的人的坏笑话......
-
链接的问题似乎是指非常长周期。
cycle通常会在 short 周期中提供非常好的结果,但对于长周期,您使用该事物的方式将决定无限列表表示是否可以解决问题,或者您是否最好更改程序的结构。
标签: haskell infinite circular-list