『ふつうのHaskellプログラミング』正誤表

$Id: errata.html 550 2008-03-16 15:00:16Z aamine $

質問や間違いの指摘などはメールで aamine AT loveruby.net (AT は @ に置き換え) までお願いします。

第二刷以前にある誤り

p.180, 7.6 節「関数定義」

予約語一覧の単語が間違っています。

誤: inflxr
正: infixr

p.184, 7.6 節「関数定義」表 7.1

優先順位 9、右結合の欄にある「..」は「.」の間違いです。

p.189, 7.7 節「定義と束縛」

誤: 文字列をパターン(x:xs)で受けて
正: リストをパターン(x:xs)で受けて

第一刷の誤り

p.28, 2.3節「入出力の基本」

誤: USA-stats.txt
正: USA-states.txt

p.68, 3.2節「高階関数」

ページ前半のリストで、'f' が抜けている

誤:

→ ['a', 'b', 'c', '@', 'd', 'e', '\n']
→ "abc@de\n"

正:

→ ['a', 'b', 'c', '@', 'd', 'e', 'f', '\n']
→ "abc@def\n"
p.97, 4.2節「総合演習」

誤: match pattern = any . (pattern `isPrefixOf`) . tails
正: match pattern = any (pattern `isPrefixOf`) . tails

p.117, 5.2節「遅延評価のシミュレーション」

誤: (translate c1) : (map f cs1)
正: (translate c1) : (map translate cs1)

p.117, 5.2節「遅延評価のシミュレーション」

誤: if式を簡約します。その過程で(==)関数のパターンマッチが起こり、cが評価されます。
正: if式を簡約します。その過程で(==)関数のパターンマッチが起こり、c1が評価されます。

p.134, 6.3 節「数値」

誤: trancate
正: truncate

p.270, 11.3 節「リストモナド」

将棋は「打つ」ではなく「指す」のが正しいそうです。 ただ、このページの「打つ」を「指す」に変えると 文章のつながりを維持するのが難しくなるため、 少なくとも初版のあいだは現在の文章のままにとどめます。

p.306, 12.5 節「モデルの実装」

誤: リスト 12.9 Database型の定義
正: リスト 12.9 pagePath関数(Database.hs)

p.334, 13.4 節「ブロック要素のパーサ」下から 2 行目

誤: captionパーサからparagraphパーサまでは、各プロック要素のパーサです。
正: headlineパーサからparagraphパーサまでは、各プロック要素のパーサです。

p.335, 13.4 節「ブロック要素のパーサ」下から 4 行目

誤: つまり、captionパーサは行の最初の文字が「=」である行を受け付けます。
正: つまり、headlineパーサは行の最初の文字が「=」である行を受け付けます。

p.335, 13.4 節「ブロック要素のパーサ」下から 2 行目

誤: captionパーサの意味値は、行をh1〜h6エレメントにコンパイルした値です。
正: headlineパーサの意味値は、行をh1〜h6エレメントにコンパイルした値です。

p.337, 13.4 節「ブロック要素のパーサ」

「unlines関数」であるべきだが「lines関数」と書かれているところが 2 点あります。

誤: join関数は、段落の……連結します。lines関数にも似た働きですが、……違います。lines関数だと末尾に改行が付きます。
正: join関数は、段落の……連結します。unlines関数にも似た働きですが、……違います。unlines関数だと末尾に改行が付きます。

p.341, 13.5 節「パーサコンビネータライブラリの実装」

誤: 「test x」がTrueであるときに限って、「Just (x, xs)」を返します。……
正: 「f x」がTrueであるときに限って、「Just (x, xs)」を返します。……

p.351, 14.3 節「ドキュメント」

誤: 監訳者
正: 監修者

p.359, 付録 A.2 練習問題の解答例 6.1 (3)

誤: readTemplate id = readFile (((prefix repo) ++ "/") ++ id)
正: readTemplate id = readFile ((prefix repo) ++ ("/" ++ id))

p.361, 付録 A.2 練習問題の解答例 8.4

問題は tail.hs をポイントフリーにせよとなっていますが、 p.361 の解答例がポイントフリー版 head.hs になってしまっています。 正しい解答例は以下の通りです。

main = do cs <- getContents
          putStr $ lastNLines 10 cs

lastNLines n = unlines . takeLast n . lines

takeLast n = reverse . take n . reverse
p.362, 付録 A.2 練習問題の解答例 11.1

間違いではありませんが、 問 2, 問 3 の解答例には main の型宣言があるのにも関わらず 問 1 の解答例には main の型宣言「main :: IO ()」がありません。 型宣言を追加したほうがよいでしょう。