関数型プログラミング言語Haskell Part3
■ このスレッドは過去ログ倉庫に格納されています
0256デフォルトの名無しさん
NGNGいいので、まず返り値に必要な部分から計算されます。
したがって、遅延評価ならば、a >> bにおいてworldに最後に関与する
「外側」にある"b"のほうから評価が行われるはずだということになります。
これが「右から(Lazyに)」の意味です。
ちろんこれではループも書けないのでIOモナドとしては使えません。
しかし、WorldについてStrictなモナドだとすれば、
左から評価されるようになります。
-- typeではモナドの定義がHaskell98では書けない。
newtype IO a = IO { runIO :: World -> (a, World) }
instance Monad IO where
ioact >>= f = IO $ \world -> world `seq`
let (a, world') = runIO ioact world
in runIO (f a) $! world'
もしよくわからなければ、Control.Monad.Stateのlazyなstateモナドで
loopや末尾再帰のプログラムを書いて挙動を観察してみてください。
■ このスレッドは過去ログ倉庫に格納されています