Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

13章分の9章

プログラミング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つ出力されているのも不思議ですが,これは実行したときの表示だけの問題なのかなと思っています。