2009年10月29日 11:00 [Edit]

LearnBy $ Haskell $ Hand - #書評_ - Real World Haskell

オライリー矢野様より献本御礼。

素晴らしい。これなら Ph. D どころか中卒でも、Haskellが頭でなく手でわかるようになる。特に

という要求に確実に答えてくれるという点で画期的だ。さすがのOraクオリティ。


本書「Real World Haskell」は、タイトルどおり、理論家のためではなく実践家のためのHaskell指南。

目次 - O'Reilly Japan - Real World Haskellより
まえがき
1章 始めましょう
2章 型と関数
3章 型を定義し、関数を単純化する
4章 関数プログラミング
5章 ライブラリを書く:JSONデータの操作
6章 型クラスを使う
7章 入出力
8章 効率的なファイル処理、正規表現、ファイル名マッチング
9章 入出力事例研究:ファイルシステム検索ライブラリ
10章 コード事例研究: バイナリデータフォーマットの構文解析
11章 テストと品質保証
12章 バーコード認識
13章 データ構造
14章 モナド
15章 モナドを使ったプログラミング
16章 Parsecを使う
17章 Cとのインタフェース: FFI
18章 モナド変換子
19章 エラー処理
20章 Haskellのシステムプログラミング
21章 データベースを使う
22章 規模の大きい例:ウェブクライアントプログラミング
23章 gtk2hsを使ったGUIプログラミング
24章 並行マルチコアプログラミング
25章 プロファイリングと最適化
26章 高度なライブラリの設計:ブルームフィルタ
27章 ソケットとsyslog
28章 ソフトウェア・トランザクショナル・メモリ
付録A GHCとHaskellライブラリをインストールする
付録B 文字、文字列、エスケープ規則
索引

目次を見ただけでも本書の 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

この記事へのコメント
政治の話は、子供から老人まで誰でも参加できる。
何日たってもコメントゼロ。
Posted by 僕はバカです at 2009年10月30日 21:49
これは面白い記事だよ。
ちょっと悩んでいるプログラマには、
非常に興味深くて、勉強になるなぁ〜

何かがありそうだという気にさせてくれる記事だ

ありがとー
Posted by のり at 2009年10月31日 05:31