我正在学习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
没有终止,但我预计repeat
返回的thunk只能评估到第一个缺点:
...
GHCi> take 3 x
[1,2,3]
it :: [Integer]
GHCi> :sp x
x = 1 : 2 : 3 : _ <= This is not happening
我错过了什么?
答案 0 :(得分:5)
“问题”是repeat y
指的是自己,
repeat y = let ys = y:ys in ys
因此,一旦评估了第一个cons单元格,就会完全评估repeat y
。在ASCII艺术中:
(:) <-
/ \ |
y \_|
只要事物已被评估,就会打印 :sp
...