Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

13章分の11章

プログラミングHaskell』の11章を読みました。

第11章 切符番号遊び

切符番号遊びとは,切符の端に書いてある4つの数字を使って,10になるように数式を組み立てる遊びだそうです。
本章では,ゲームのルールを少し変更し,利用する数は任意の大きさで,全部を使わなくても良く,目標も任意の数として与えられる。また,計算途中に出てくる数は,自然数でなければならず,負の数や0,自然数に直せない分数は許されないとしています。

今までの章と同じように小さな関数を作りながら,それを組み上げていくといつの間にか完成しています。題材が非常に面白いので,楽しく読み進めることができました。

途中,組み合わせを扱う便利な関数subs, interleave, permsを定義するのですが,どっかで見たことがあると思ったら,以前,Schemeで取り組んでいました。

Haskellと比べて,ちょっと長くなっていますが,これは僕のSchemeを書く技術が稚拙だからだと思います。元ネタは,訳者の山本和彦さんです。

山本さんのブログの中で,

僕は Haskell を知るまで、再帰に関しては、もう学ぶべきことはないと思っていました。しかし、繰り返しさえ再帰で実現しなければならない純粋関数型言語に触れてはじめて、再帰の深淵を見た気分になりました。

とあります。僕の場合は,再帰を語るほどのレベルに達していませんが,本書で再帰の面白さを感じています。

最後に実行例です。例えば,与えられた数が,1,3,7,10,25,50であり,目標が765だとすると,

Main> head (solutions' [1,3,7,10,25,50] 765)
App Mul (Val 3) (App Sub (App Mul (Val 7) (App Sub (Val 50) (Val 10))) (Val 25))

となります。実行結果が見辛いですが,これは,3*(7*(50-10)-25)です。数多の組み合わせを試行して答えを導く。まさにコンピュータならではだなぁと思います。