2013-06-18 12 views
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 doesnの終了するには、私はrepeatによって返されたサンクが最初の短所まで評価されることを期待した:

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

私は何が欠けていますか?

答えて

5

「問題」は、第1のコンス・セルが評価された後ので、repeat yが完全に評価され、repeat y自体を指すこと

repeat y = let ys = y:ys in ys 

あります。

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

限りの事は、すでに評価されて:spプリント...

:ASCIIアートで