「Real World Haskell」読書メモ 7.入出力 7.1 Haskellにおける古典的入出力

return は純粋な値を IO アクションでくるんで返す。

Prelude> :t "Hello,world!"
"Hello,world!" :: [Char]

Prelude> :t return "Hello,world!"
return "Hello,world!" :: (Monad m) => m [Char]

Prelude> h <- return "Hello,world!"

Prelude> :t h
h :: [Char]

Prelude> h
"Hello,world!"

"<-" は return と反対で、IO アクションから返された値のみをバインドする。

Prelude> ret <- putStrLn   "Hello,world!"
Hello,world!  -- ここでアクションは実行される。

Prelude> :t ret -- ret にバインドされたのは空のタプルのみ。
ret :: ()

入出力アクションが実行できるのは他の入出力アクションから呼ばれたとき。

Prelude> let action = putStrLn   "Hello,world!"

Prelude> :t action
action :: IO ()

Prelude> action -- 他の言語からすればここが不思議。
Hello,world!

Prelude>  let hello = putStr   "Hello,"
Prelude>  let world = putStrLn   "world!"

Prelude> :t sequence_
sequence_ :: (Monad m) => [m a] -> m ()

Prelude> sequence_  [hello , world]
Hello,world!