計算機科学のブログ

HaskellのI/O 複数行のユーザー入力の読み込み、getContents関数、遅延評価

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT4(HaskellのI/O)、LESSON 22(コマンドラインの操作と遅延I/O)、22.4(練習問題)のQ22-2の解答を求めてみる。

コード

-- Wikipediaの格言の例より https://ja.wikipedia.org/wiki/格言
aphorisms :: [String]
aphorisms = ["狭き門より入れ",
             "巧言令色鮮矣仁",
             "無用の用",
             "泣いて馬謖を斬る",
             "人の行く裏に道あり花の山"]

lookupAphorisms :: [String] -> [String] 
lookupAphorisms [] = []
lookupAphorisms ("n":ms) = []
lookupAphorisms (m:ms) = (aphorisms !! (read m - 1)):lookupAphorisms ms

main :: IO ()
main = do
    input <- getContents 
    mapM_ putStrLn (lookupAphorisms (lines input))

入出力結果(Terminal, Zsh)

% ghc sample2.hs
Loaded package environment from /.../.ghc/x86_64-darwin-8.10.5/environments/default
[1 of 1] Compiling Main             ( sample2.hs, sample2.o )
Linking sample2 ...
% ./sample2
1
狭き門より入れ
2
巧言令色鮮矣仁
3
無用の用
4
泣いて馬謖を斬る
5
人の行く裏に道あり花の山
6 
sample2: Prelude.!!: index too large
% ./sample2
a
sample2: Prelude.read: no parse
% ./sample2
2
巧言令色鮮矣仁
4
泣いて馬謖を斬る
n
%