最近下記の記事を読んで。
私、map 派でした。
そうか、関数型は結構合ってるのかもしれん。純粋関数型言語は使ったことなかったけど。なんとなく融通効かなさそう、とか、理想が高過ぎて実用的ではなさそう、みたいな先入観で捉えてましたが。しかし、私の理想とするプログラムの組み方は関数型だったのか。
仕組みと定義でソフトウェアを組み上げていくという考え方は 100% 同意。分かりづらいかもしれないが、ランダムという要素を無くしたパチンコ台みたいなもので、玉を転がしたらあるルールに従って然るべき所に自動的に転がっていくという。バグを一番少なくできるやり方だと思う。異常系も含めて想定外を無くす的な。オートマトンとかもそう。「やりたいことを宣言的に書いておけば、あとはコンピューターが頑張ってくれる」という発想は大事。
なので、初心者向けの講座で良くあるような「順に A やって、次に B やって」というプログラムの作り方はよろしくないと思うのです。
そうは言っても純粋な関数型(と何か言えるほどの見識もなく)、というのだと実際問題としてプログラム作れないんじゃなかろうか、という先入観があった。というか、今もある。その辺は原理主義者ではなく現実主義者なのかなー、と思う。
個人的には仕組みで作っていくやり方は、「フレームワークとライブラリとオブジェクト指向で組み上げていくイメージ」を持ってました。
単に見た目で Lisp を避けてただけかもしれないけど。(かっこ)ばっかりなので。今やってる Kinx も、やたら見た目にこだわってるし。
ということで、map 派。そして reduce 派。Kinx での例。
var a = 100.times();
var r = a.map(&(e) => e * 2).reduce(&(r, e) => r + e);
System.println(r);
結果。
9900
あ、Array の説明してないな。近々書きます。こういう map とか reduce とか、Array 用の特殊メソッドもいくつか定義してあるので、使えると幅が広がる。
ただし、Array と Object は本質的に同じなので、Array の特殊メソッドはオブジェクトにも適用されるので注意。逆に Object という名の特殊オブジェクトは無いので、それもご注意。