Posted at

【Haskell】do糖衣構文の制約と変換

More than 1 year has passed since last update.

do構文は、全ての式が同じモナドを返さなければなりません。

action = do

print 1 -- 戻り値の型は IO ()
getLine -- 戻り値の型は IO String
putStrLn "Hello" -- 戻り値の型は IO ()

do構文は糖衣構文です。上記アクションは、以下のように変換されます。

action = print 1 >>= (\_ -> getLine >>= (\_ -> putStrLn "Hello"))

do構文では、var <- actionという式を記述することができますが、これは上記ラムダ式の引数に名前を与えることと同義です。例えば以下のようなアクションは、

action = do

xxxxx <- getLine
putStrLn xxxxx

以下のように変換されます。

action = getLine >>= (\xxxxx -> putStrLn xxxxx)

do構文にはletを記述できます。

action = do

let var = "hello"
print var
putStrLn "end"

上記アクションは、以下のように変換されます。

action = let var = 123 in (print var >>= \_ -> putStrLn "end")


まとめ

-- do糖衣構文

action = print 1 >>= (\_ -> getLine >>= (\_ -> putStrLn "Hello"))

-- xxxxx <- getLine
action = getLine >>= (\xxxxx -> putStrLn xxxxx)

-- let var = 123
action = let var = 123 in (print var >>= \_ -> putStrLn "end")