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の入出力を効率的に実装するアイデアが思いつかないなーと思っているのが、今の状況なわけです。