Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
重复定义如下:
repeat :: a -> [a] repeat x = xs where xs = x:xs
是否有任何理由不使用以下内容?
repeat :: a -> [a] repeat x = x : repeat x
(显然,许多 Prelude 函数有许多等价的定义,但我后面的描述感觉更明显。我想知道它的方式是否有性能或风格的原因。)
这是出于性能和空间复杂性的原因。
代码的第一个版本使用显式共享;它基本上看起来像内存中的单元素循环链表(xs代码中的 是一个具有xas 值的列表节点,它的尾部指向同一个列表节点)。当您评估列表中越来越多的元素时,它只会重复使用同一个节点。
xs
x
相比之下,第二个版本创建的列表在评估时实际上会在内存中增长,因为repeat x总是重新计算不同的调用(而不是记忆)。在生成的列表末尾总会有另一个未评估的 thunk。
repeat x