Posted on December 12, 2012

Haskell だけどモナドがあれば IO してもいいよね

Haskell で IO を扱います。逐次的に書けます。

こんせか

main = putStrLn "Hello World!"
ここで型は以下のように定義されています。
putStrLn :: String -> IO ()

えうれか

do の中では逐次的(上から順番)に処理がなされます。 do の中に書ける関数の型は do を書いた位置のもの(モナド)と同じである必要があります。
main は IO a のような型を返す決まりになっているので、以下の do 以下の式でも IO a の型を持つ必要があります。
main = do
    somethingDo
    anythingDo
一番シンプルな例
main = do
    return ()
この文脈で return を使うと do は IO にかかっているので、 return () で IO () を返します。 上記の関数は実際には何もしません。
main = do
    getLine
getLine :: IO String なので、この do の中に書くことができます。
getLine は標準入力を受け付ける関数です。 main 実行後に Enter を押すまでキー入力を受け付けます。
せっかくなので入力した文字を出力してみましょう。
main = do
    line <- getLine
    putStrLn line

line <- getLine では getLine を line に束縛しています。 ここで line :: String になっています。
getLine :: IO String から IO を外したものが束縛された line の型になります。
line :: String なので、putStrLn :: String -> IO () の引数として渡すことができます。

今回は標準入出力を扱うだけのものすごく単純な例を丁寧に解説しました。
正しく基本を理解して拡張していけば、ファイルを読み書きするコードやもっと複雑なコードも理解できるようになるはずです。

ブクログ

twitter