2012年12月30日日曜日

「すごいHaskellたのしく学ぼう」9章 todo.hsのバグ修正など


「すごいHaskellたのしく学ぼう」でHaskellを勉強し始めてみた。通称すごいHな本と言われる本ですが、Hは変態言語の頭文字のHなのかなあと思うほどに自分にとっては新鮮な概念が多く、久しぶりに言語を勉強して脳がリフレッシュされていく感じがします。Hello Worldが3分の1くらい読み進まないと出てこない本です。説明が丁寧で初めてHaskellに触れる自分でも理解しやすいです。訳者が自分の大学学部時代の同じ学科の同級生らしく、感心している場合ではないなあと思う今日このごろ。

そして、原著はオンラインで読めたのだな。。。。
Learn You a Haskell for Great Good!

今日は、第9章のtodoリストのコードにバグらしきものをいくつか発見したので、誰かの役に立てばと書き記しておきます。

ちなみに、Haskellのシンタックスハイライトは下記をBlogのテンプレートに貼付けて使用しています。Bloggerで使用する場合は、CDATAセクションで囲まないとXMLエラーになります。
http://code.google.com/p/syntax-highlighter-brushes/source/browse/scripts/shBrushHaskell.js

本のコードで修正したのは以下の2点。ちなみに2点目はオンラインの原著ではすでに修正されていた。
  • removeで重複要素が存在する時に後の番号を指定すると、先の番号の方が削除されてしまう
  • 引数でファイル名を指定しているのに、"todo.txt"がハードコードされている

以下が修正コード。コメントアウト部分が元々の部分。

以下のコードだと最初に見つかった要素を削除してしまうため、todoTasksが[1,2,3,1,4,5]という状態の時に4番目にある"1"を削除した時に、1番目の1を削除してしまいます。
delete (todoTasks !! number) todoTasks

./todo remove todo.txt 4
-> Expected: [1,2,3,4,5]
-> Actual : [2,3,1,4,5]

読者への宿題になっているbumpも実装してファイル書き込み部分の重複をupdateTodoにまとめたのが以下。

0 件のコメント:

コメントを投稿