【问题标题】:Why is repeat defined in Prelude as it is? [duplicate]为什么在 Prelude 中按原样定义重复? [复制]
【发布时间】:2013-06-06 14:04:25
【问题描述】:

如下重复is defined

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

是否有任何理由不使用以下内容?

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

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

【问题讨论】:

标签: haskell


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2021-08-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多