2009年10月29日 11:00 [Edit]
LearnBy $ Haskell $ Hand - #書評_ - Real World Haskell
オライリー矢野様より献本御礼。

Real World Haskell
Bryan O'Sullivan / John Goerzen / Don Stewart /
山下 伸夫 / 伊東 勝利 / タイムインターメディア訳
[原著:Real World Haskell]
素晴らしい。これなら Ph. D どころか中卒でも、Haskellが頭でなく手でわかるようになる。特に
モナドの説明文章って、何個か読んでみたけど、「これを紹介したい!」「これも紹介したい!」ってのが強すぎて、まずプログラミング言語の一要素として使えるようにして、体感してもらってからじゃないと、理解進まないんじゃないの?というのが多いという不満。
という要求に確実に答えてくれるという点で画期的だ。さすがのOraクオリティ。
本書「Real World Haskell」は、タイトルどおり、理論家のためではなく実践家のためのHaskell指南。
目次 - O'Reilly Japan - Real World Haskellより
|
|
目次を見ただけでも本書の Real World ぶりが伝わってくるが、やはりそれを最も強く感じるのは、モナドの説明だろう。本書はモナド則を、こう説明している。
14.14 モナド則およびよいコーディングスタイルモナド則は単に「モナドは予想外のことをすべきではない」ことを形式的に言っているだけです。
「予想外のことをすべきではない」。これはすなわち順序のことであり、秩序のことである。英語ではどちらも Order 。モナドを一言で言うと、「秩序そのものを関数化したもの」なのである。
Haskellは、純粋関数型で遅延評価するプログラミング言語である。ここまではプログラマーであれば耳にしたことがある。「へぇー」といったところだ。
ところが、「純粋関数型というのは、同じ引数に対して、必ず同じ答えを返すということだ」という説明を聞くと、プログラマーであればすぐに、「ちょちょwww」となるだろう。「違う答えが返ってくる関数なしで、どうやって現実問題を解くのか」、と。
たとえば、以下の簡単なJavaScriptのプログラムを考えてみる。
var now = new Date(); alert(now);
日時を表示するだけの簡単なプログラムだが、しかし「同じ引数に対して、必ず同じ答えを返す」のでは日々刻々と変わる「日時を得る関数」なんて書けないではないか。new Date()相当を一体どうやってやるのだ?
逆に考えるんだ。関数さえ常に同じ値を返せばいいのだ、と。
でもどうやって?
こうやって。
var doItWithDate = function(f){ return f(new Date) };
doItWithDate(alert);
前の例、すなわち逐次型プログラミングでは「日付というデータを関数で得てから、それをalertする」となっていたのが、ここでは「日付を使って何かをする関数に、alertを引数として渡す」になっている。「違う答えを返す」部分はこれで一切外に出てこない。
モナドとは、この「逆に考えるんだ」を、プログラマーが考える代わりにHaskellという言語にやらせるための手段なのである。より具体的には
first = step0(zeroth); second = step1(first); third = step2(second); ... last = stepn(prev);
という順序を、
last(...third(second(first(zeroth)))...)
に、そしてHaskell的にさらに書き直すと
last $... $ third $ second $ first $ zeroth
にするための仕組みだということだ。
>>=演算子が、「プログラム可能なセミコロン」というのは、そういう意味なのである。
前述の通り、モナドというのは Order を関数で表現したものである。「順序」以外の Order にももちろん使える。リストもモナドであるのは、それがわかってしまえば実に自然なことである。
「逆に考える」を常にプログラマーがやろうとすると、「やっぱ Ph. D でなければ駄目だorz」となってしまうが、Haskellでは言語がやってくれるのである。Haskellは「サルにも書ける」どころか「サルこそ書くべき」言語だというのが著者の主張であり、一匹の猿として禿しく同意せざるをえない。
そしてモナドの説明は、本書に詰まった「サル知恵」/= 猿が作った知恵; == 猿でも使いこなせる叡智; のごく一部に過ぎない。これだけのサル知恵が詰まって3,990円。これは安い。
本書は、孫悟空の如意棒である。Haskellを緊箍児に感じて頭痛がする人は、本書で自由になってほしい。
Dan the (Dys)?functional Programmer
この記事へのトラックバックURL
何日たってもコメントゼロ。
ちょっと悩んでいるプログラマには、
非常に興味深くて、勉強になるなぁ〜
何かがありそうだという気にさせてくれる記事だ
ありがとー