Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么在前奏曲中重复的定义是这样的?_Haskell - Fatal编程技术网

Haskell 为什么在前奏曲中重复的定义是这样的?

Haskell 为什么在前奏曲中重复的定义是这样的?,haskell,Haskell,重复以下步骤: repeat :: a -> [a] repeat x = xs where xs = x:xs 是否有任何理由不使用以下内容 repeat :: a -> [a] repeat x = x : repeat x (显然,对于许多前奏曲函数有许多等效的定义,但我后面的描述感觉更为明显。我想知道它的这种方式是否有性能或风格的原因。)这是出于性能和空间复杂性的原因 代码的第一个版本使用显式共享;它基本上看起来像内存中的一个单元素循环链表(代码中的xs是一个列表节点,其

重复以下步骤:

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

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

(显然,对于许多前奏曲函数有许多等效的定义,但我后面的描述感觉更为明显。我想知道它的这种方式是否有性能或风格的原因。)

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

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

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

。那里的定义使用了
let
,但与
where
的行为相同。