このコード ( Learn You A Haskellから取得):
main = do putStr "Hey, "
putStr "I'm "
putStrLn "Andy!"
どうやら脱糖する
main = putStr "Hey, " >>=
(\_ -> putStr "I'm " >>=
(\_ -> putStrLn "Andy!"))
これは、私が理解しているように、「StrLn "Andy!" を配置するには、まず putStr "I'm " が必要であり、そのためには、最初に putStr "Hey, "; が必要です」と解釈できます。
私はこの解釈に同意しません。これは、コンパイラが明らかにそうではなく、私を混乱させているため、迷惑です。私が抱えている問題は、ラムダが引数を無視することです。遅延評価中に、この種のことは認識されて短絡するはずではありませんか?
また、確かに、バインディングは IO アクションを返し、その IO アクションがメインになると実行されます。しかし、「Hey, Andy!I'm」と表示されないようにするにはどうすればよいでしょうか? 私はそれがバインドがしていることだと思います。
また、「IO ()」タイプの IO アクションは、ランタイム システムが「Hey, I'm Andy!」を出力できるようにするのに十分な情報をどのように運ぶのでしょうか? IO () は、「Hello World!」を出力するよりも IO () とどう違うのですか? またはファイルに書き込みますか?
モナドのウィキペディアのページから、別のことを考えてみましょう:
砂糖漬けバージョン:
do
putStrLn "What is your name?"
name <- getLine
putStrLn ("Nice to meet you, " ++ name ++ "!")
脱糖バージョン:
putStrLn "What is your name?" >>=
(\_ ->
getLine >>=
(\name ->
putStrLn ("Nice to meet you, " ++ name ++ "!")))
似たような話はこちら。
IO の bind の定義を確認するだけで、すべてが明確になると思います。他に大いに役立つのは、プログラムが実際にどのように評価され、副作用が発生する正確な瞬間を特定するかを誰かが手伝ってくれることです。