5

我正在学习 Haskell 并编写了这个函数:

continueWith :: [a] -> a -> [a]
continueWith [] y     = repeat y
continueWith (x:xs) y = x : (continueWith xs y)

现在,我不明白 GHCi 的行为:

GHCi> let x = continueWith [1, 2] 3
x :: [Integer]
GHCi> :sp x
x = _
GHCi> take 3 x
[1,2,3]
it :: [Integer]
GHCi> :sp x

最后一个sprint不会终止,但我希望返回的 thunkrepeat只评估到第一个缺点:

...
GHCi> take 3 x
[1,2,3]
it :: [Integer]
GHCi> :sp x
x = 1 : 2 : 3 : _      <= This is not happening

我错过了什么?

4

1 回答 1

5

“问题”是repeat y指它自己,

repeat y = let ys = y:ys in ys

所以一旦第一个 cons 单元被评估,repeat y就被完全评估。在 ASCII 艺术中:

  (:) <-
 /  \  |
y    \_|

:sp就已经评估过的东西打印...

于 2013-06-18T18:21:08.883 回答