2013-06-18 24 views
5

tôi đang học Haskell và viết chức năng này:Learning Haskell: thunks trả về bởi lặp lại

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

Bây giờ, tôi không hiểu được hành vi của 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 

Các sprint doesn cuối cùng 't chấm dứt, nhưng tôi mong đợi các thunk trả về bởi repeat được chỉ đánh giá lên đến khuyết điểm đầu tiên:

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

Tôi đang thiếu gì?

Trả lời

5

Các "vấn đề" là repeat y đề cập đến bản thân,

repeat y = let ys = y:ys in ys 

vì vậy một khi các tế bào khuyết điểm đầu tiên được đánh giá, repeat y là hoàn toàn đánh giá. Trong nghệ thuật ASCII:

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

:sp in như xa như điều đã được đánh giá ...

Các vấn đề liên quan