汎用入力関数

リストをテーブル表示するプログラムが Haskell のデータ出力に汎用できると書いたが、入力の汎用関数があると便利だと考えた。そこで、次のようなプログラムを作ってみた。

genin = do { cs <- getLine; if cs == "" then return [] else do { rest <- genin; return (words cs ++ rest) } }

関数 genin をコマンドラインから実行すると、文字列を入力できる。文字列をスペースで区切って入力すると配列の要素として入力することができる。改行をしても入力は続くが、空行を入力すると終了して、IO型の配列で要素が文字列になったものを戻値として戻してくる。

Main> genin >>= print
aaa bbb ccc
ddd eee fff

["aaa","bbb","ccc","ddd","eee","fff"]

次の例はスペースで区切った数値を入力してその総和を計算している。

Main> genin >>= return . map (read::String->Int) >>= return . sum >>= print
1 2 3
4 5 6

21

do 記法を使ったほうが若干分かりやすくなる。

Main> do {xs <- genin; print (sum $ map (read::String->Int) xs) }
1 3 2
4 5 6
7 8 9
10

55

コンソールからの入出力はIOモナドの世界で行わなければならないので、扱いがやや面倒になる。処理の大半の部分を純粋関数の世界で作っておいて、必要最小限の部分をIOモナドの世界で行わせるようにした方がいい。

前回の記事と合わせて、汎用の入出力関数が手に入ったので、アルゴリズムの部分にだけ注力できるようになった。すばらしい Haskell 世界の入り口に立ったような気分だ。


今日のHaskell
List> transpose [[1,2,3],[4,5,6]]
[[1,4],[2,5],[3,6]]

(Data.)List モジュールの transpose は転置行列を作る。
[PR]
by tnomura9 | 2010-11-30 17:48 | Haskell | Comments(0)
<< 行列の積 リストをテーブル表示する >>