Haskell : モナド
[id:lethevert:20060908:p1]の実装は、なんとなくもっともらしいのですが、実際には、HaskellのIOモナドの実装とは違う挙動を示します。(これは、先にk.inabaさんの指摘で気づいたことですが)
次のような関数を定義して実行すると、
start2 :: () start2 = let A a = k in a where k = print2 "Hello " `seq` print2 "World!"
結果は
MyIO> start2 Hello World! ()
となりますが、同じことをIOモナドでやると
MyIO> putStrLn "Hello " `seq` putStrLn "World!" World!
となり、"Hello "は出力されません。
これを見て、Haskellの入出力を効率的に実装するアイデアが思いつかないなーと思っているのが、今の状況なわけです。