『プログラミングHaskell』の9章を読みました。
第9章 対話プログラム
本章の最後に,「電卓」と「ライフゲーム」を作成します。簡単な関数を少しずつ作って,それを組み合わせていくと出来上がるのですが,それが心地よいです。
疑問点など
本章の練習問題は,1番から難しく感じました。今まで,解答を見ずに読み進めてきたのですが,残念ながら妥協して解答をダウンロードしました。1番の解答を見て疑問に思ったのは,「インデント」です。
p108のgetLineを入力するときは,ifとelseの行頭を揃えないことに注意しました(mygetLineとして入力しました)。
mygetLine :: IO String mygetLine = do x <- getChar if x == '\n' then return [] else -- 揃えないこと! do xs <- mygetLine return (x:xs)
しかし,練習問題の1では,揃っていても揃っていなくても良いようです。なんかこの辺りのルールは難しいですね。
readLine :: IO String readLine = get "" get xs = do x <- getChar case x of '\n' -> return xs '\DEL' -> if null xs then get xs else -- 揃っていても揃っていなくても良い do putStr "\ESC[1D \ESC[1D" get (init xs) _ -> get (xs ++ [x])
あと,DELキーが押されたときに,"\ESC[1D"が2つ出力されているのも不思議ですが,これは実行したときの表示だけの問題なのかなと思っています。