2007-10-05

あるPython信者がたどったHaskellの入り口までの道のり

Haskellの勉強がついにその入り口の敷居を超えた気がするので、ここまでの経緯を記録しておく。

* 1年ほど前、、、「入門Haskell」を購入して一読するも理解できず。

* その1ヶ月後、、、「ふつうのHaskell」を購入して一読。途中まで写経。全体像がぼんやり見えてくるも未だ「代数的データ型」とか「型クラス」とかが一体何のためにあるか理解できず。モナドに至っては全くわからない状態。

* それからしばらくして、「モナディウスの解説ページ」を発見。Haskellでのプログラミングの進め方が、これまでのプログラミングとはずいぶんと違うことを発見。「代数的データ型」とか「型クラス」とかがわかり始める。

* それからしばらくして、仕事で作ったPythonの短いスクリプトをHaskellに移植してみる。やっぱりPythonのほうが楽だし実行時のパフォーマンスもはるかにいいし、Haskellを勉強する意欲が失せる。

* それからしばらくして、「SICP」を読み始めるも、途中のambが出てきたあたりで挫折。写経せずに電車内での読書にしていたのが敗因か。しかし、そこまででもいろいろ深い内容でためになる。この時期、自分のPythonのプログラムにやたらとmap、filter、lambdaが増え始め、そのPythonにあるまじき傾向に自制の必要を感じる。

* それからしばらくして、OCamlに手を出すも、データ型の扱いがシビアすぎて萎える。

* しばらくは時々Haskellに思いを馳せるだけの日々。結局どういうときに「代数的データ型」を使って、どういうときにただのリストとかpairで済ませるのかにうじうじと思い悩む。。。

* 数日前、「Haskellのお勉強」の写経を始める。いろいろわかり始める。敷居を超えた感を初めて味わう。

* 二日前、モナドの定義やモナド則を、チラシの裏に書いて試行錯誤してなんとか理解。モナドの演算の「m >>= k」は、「(>>= k)がmに右から作用する」と読む事で理解が深まることに気づいた。(←この視点で可換図式を書いてモナド則を理解するのがいいようだが、合っているかの自信はない。)ただこれが実際にプログラミングでどう役に立つのか、特にdo式をどういう文脈で理解すべきか、IOモナドの詳細とか、Listモナドをモナドと見なすことのご利益の理解はこれから。

* 今日、仕事であるバッチの複雑な計算処理をHaskellで書いてみた。ベクトルの各種演算とか、ファイルのIOがたらふくあるようなやつです。でも予想外にすんなり書けて驚いた。60行ぐらいの規模のプログラム。こんなに短くなるとは予想していなかった。可読性はPythonには劣るものの、なんだか気持ちいいプログラムになって満足。でも、あちこちでmap, filter, zip系を使うので、書いてある内容の密度はすごい。


ここまで1年かかっているが、昔3回ぐらい挫折を繰り返しながら数年のレンジでC++を身につけたのに比べると、まだましな道のりだろう。