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!