IO モナドのループの書き方

IO モナドのプログラムも一本道のものは、return, >>=, >> を使いこなせるようになればそう困らない。しかし、ループを書こうとすると悩んでしまう。この記事では、IOモナドのループの書き方を集めていきたい。

do 記法を使うやり方。

Prelude> let loop = do getLine >>= putStrLn; loop
Prelude> loop
hello
hello
world
world
^Z

ファイルに作成する場合
main = do
  cs <- getLine
  putStrLn cs
  main

mapM_ を使うやり方

Prelude> mapM_ (\_ -> getLine >>= putStrLn) [1..]
hello
hello
world
world
^Z

ファイルに作成する場合
main = MapM_ (\_ -> getLine >>= putStrLn) [1..]

interact を使うやり方

Prelude> :m System.IO
Prelude System.IO> interact id
hello
hello
world
world
^Z

ファイルに作成する場合
import System.IO (interact)

main = interact id

空行でループを抜け出すやり方

Prelude> let loop = do cs <- getLine; if cs == "" then return () else do putStrLn cs; loop
Prelude> loop
hello
hello
(空行の入力でループを抜け出す)

ファイルに作成する場合
main = do
  cs <- getLine
  if cs == ""
    then retrun ()
    else do
      putStrLn cs
      main

指定した個数の文字列をコンソールから取得して IO [String] にする場合。

Prelude> mapM (\_ -> getLine) [1..5]
hello
world
how
are
you
["hello","world","how","are","you"]

文字列の取り込みを空行で終了する場合。

Prelude> let loop = do x <- getLine; if x == "" then return [] else do {xs <- loop; return (x : xs)}
Prelude> loop
hello
world

["hello","world"]

ファイルに作成する場合

loop = do
  x <- getLine
  if x == ""
    then return []
    else do
      xs <- loop
      return (x:xs)
[PR]
by tnomura9 | 2011-10-15 02:32 | Haskell | Comments(0)
<< Vocaloid3 IOモナドのイメージ >>