2013-06-18 14 views
5

uczę Haskell i napisał tę funkcję:nauka Haskell: łącznikami zwracane przez powtórzenie

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

Teraz nie rozumiem zachowania 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 

Ostatnie sprint robi zakończyło się, ale spodziewałem się, że thunk zwrócony przez repeat zostanie oceniony tylko do pierwszych minusów:

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

Czego mi brakuje?

Odpowiedz

5

„Problem” jest repeat y odnosi się do siebie,

repeat y = let ys = y:ys in ys 

więc po raz pierwszy wady komórek ocenia się, repeat y całkowicie oceniane. W sztuce ASCII:

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

:sp drukuje w miarę sprawa jest już oceniany ...