関数型プログラミング

囲碁の思考ルーチンを設計しようとすると、思考の土台となるデータ構造を、頭の中でああでもないこうでもないと練るだけで時間が過ぎていきます。
オブジェクト指向だと、データ構造=クラス→ステートフルな世界に入って、思考がステートの変化なのか新しいステートなのかがわからなくなる。焦点がぼける感じ。
いつも、人工知能のご本尊LISPではどうしているのだろうと思いながら、ニーモニックの次にピジンな表現に阻まれて、とっつけませんでした。最近、Ozのおかげでパラダイムがわかると、アレルギーも弱まって、「人工知能のためのLISP入門」の中頃を眺めても意味がわかりました。(まだ、自分で書こうとは思わないけど(笑))大体、括弧というのはこうやってどうでもいいコメントを書く時に使う記号だから、LISPのプログラムは全部どうでもいいのですよ:-P
簡単な例題だったのでデータ構造もリストそのものでしたが、なるほどアルゴリズムは、関数型(すなわちステートレス)で再帰で記述されている。
ラムダ計算がチューリングマシンと等価と聞いてはいても、何か軽いショックを受けました。チューリングマシンは、有限ステートマシンと無限のメモリを仮定しますが、ラムダ計算というのは、ステートマシンなしで、無限のコンフィギュラブルな組み合わせ回路を仮定するということですね。計算可能の意味するところの印象が少し変わりました。
LISPというのは、言語仕様からコードをプリミティブなところまで分解する必要があったのですね。PROGを使わなければ、命令の実行=関数呼び出しとなっていて、並んだ順に実行するという他の言語では自明なことが自明に実行できない仕様になっている。LISPの世界にextract methodリファクタイングはないに違いない。
しかし、言語というものはやはり不思議なものです。手続き型だとコーディング段階で抽象度が意識しやすく、構造化の指針となるのですが、関数型だと、コードの抽象度が(そんなものは全部抽象でもなんでもないと言語から言われそうで)つかみにくい。でも、末尾最適化や遅延評価とか関数型ってかっこいいですね。