a-sanの日記

 | 

2006-05-11(Thu)

入門Haskell 〜はじめて学ぶ関数型言語

正誤表

http://book.mycom.co.jp/support/e2/haskell/#ERRATA

正誤表に載っていないマチガイ。

P72 練習問題(2)
末尾の']'が不要
誤	splitAt2 2 [1, 2, 3, 4] -- ([1, 2], [3, 4])]
正	splitAt2 2 [1, 2, 3, 4] -- ([1, 2], [3, 4])
P107 図
[1]と[2]が逆。
誤
   [1]
  / \
 [2]  [3]
正
   [2]
  / \
 [1]  [3]
P108 2行目
Leafではなく、Node
誤	Node 2 (Node 1 Leaf Leaf) (Leaf 3 Leaf Leaf)
正	Node 2 (Node 1 Leaf Leaf) (Node 3 Leaf Leaf)
P112 中央やや上 listToTree の枠内
listToTreeは以下のエラーが出る。
listToTree = foldl insertTree emptyTree	-- 以下のエラーが出る!
 {-
 ERROR file:.\BinTree.hs:44 - Type error in application
 *** Expression     : foldl insertTree emptyTree
 *** Term           : insertTree
 *** Type           : (a,b) -> BinTree (a,b) -> BinTree (a,b)
 *** Does not match : BinTree (a,b) -> BinTree (a,b) -> BinTree (a,b)
 -}
foldlの関数が tree pair の順なのに対して、insertTreeは pair treeの
順番になっているため。(多分)
私は以下のように直しました。foldlを使ったやり方がわからなかった。
listToTree []     = Leaf
listToTree (x:xs) = insertTree x (listToTree xs)

まだ読んでる途中なので報告してません。現在5章。

あー、もたもたしてると第2刷、第3刷が出ちゃうかも。メールしました。

explicitexplicit 2006/05/12 22:31 どうも。まだよたよたですが、とりあえず、ソースだけ
以下においてみました。
http://www.ne.jp/asahi/java/servlet/

a-san以外の方もよろしかったら、ダウンロードしてみて
ください。

a-sana-san 2006/05/12 23:22 とりあえず、ダウンロードしてみましたが、私の環境で動くのかな???
ここで紹介してもほとんど効果がないと思いますよ。(^^;
見ている人は少ないでしょうし、ここではWeb系の話はほとんどしないし。

酒井酒井 2006/05/13 13:54 はじめまして。
最後のは listToTree = foldl (flip insertTree) emptyTree とすれば良いと思います。

a-sana-san 2006/05/14 18:13 助言ありがとうございます。でも、それではエラーになりました(WinHugs)。以下のようにしたらいけました。
listToTree list = foldl (flip insertTree) emptyTree list
または、
listToTree list = foldl ((¥ f x y -> f y x) insertTree) emptyTree list

酒井酒井 2006/05/14 23:53 単相性制限(monomorphism restriction)のことを忘れていました。そのように変更しても良いし、あるいは以下のように型宣言を書くという方法もあります。
listToTree :: Ord k => [(k,v)] -> BinTree (k,v)
listToTree = foldl (flip insertTree) emptyTree

a-sana-san 2006/05/15 23:22 動きました。単相性制限??? うーむ。

 |