gpt4 book ai didi

haskell - 为什么在 Prelude 中按原样定义重复?

转载 作者:行者123 更新时间:2023-12-03 15:26:53 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why recursive `let` make space effcient?

(3 个回答)


8年前关闭。




重复 is defined如下:

repeat :: a -> [a]
repeat x = xs where xs = x:xs

是否有任何理由不使用以下内容?
repeat :: a -> [a]
repeat x = x : repeat x

(很明显,许多 Prelude 函数有许多等价的定义,但我后面的描述感觉更明显。我想知道它的方式是否有性能或风格的原因。)

最佳答案

这是出于性能和空间复杂性的原因。

代码的第一个版本使用显式共享;它基本上看起来像内存中的单元素循环链表(代码中的 xs 是一个列表节点,其值为 x,它的尾部指向同一个列表节点)。当您评估列表中越来越多的元素时,它只会重复使用同一个节点。

相反,第二个版本创建了一个列表,它在评估时实际上在内存中增长,因为 repeat x 的不同调用总是重新计算(而不是内存)。在生成的列表末尾总会有另一个未评估的 thunk。

关于haskell - 为什么在 Prelude 中按原样定义重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17031972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com