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は終了しませんが、によって返されるサンクrepeatは最初のコンスまでしか評価されないと予想しました。

...
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

したがって、最初のコンスセルが評価されると、repeat y完全に評価されます。アスキー アートでは:

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

:sp物事がすでに評価されている限り印刷します...

于 2013-06-18T18:21:08.883 に答える