函数プログラミングの集い 2011 in Tokyo
というタイトルの集まりが9月17日にありますので、皆様お誘いあわせの上ぜひお越しください。
先日のこの集まりの打ち合わせの時に@ksknac氏がちらっとおっしゃっていたのが「関数型言語じゃなくて関数プログラミング」(超意訳です。しかも酔っていたので正しくないかも。)
確かに色々な機能を持つ言語を分類しても詮無い事ですし、C言語でオブジェクト指向的な事もできないわけではない訳で、特定のプログラミング手法というかスタイルがあって、それらと言語機能がかかわりあって存在しているという感じだと思えば、より正確で前向きな議論ができそうです。当然と言えば当然の話ですが、今後はこういう言い方を気をつけてしていこうかと思っている次第。
で、その関数プログラミングの手法とかスタイルとかって何なのか。もちろん定義がある訳ではないので、@kazu_yamamoto氏がよく言う"あなたの関数型の定義って何ですか"問題になります。ただ、せっかくなのでオレオレ定義についてここで晒しておきます。
- まず一つは、関数を組み合わせることで大きな処理を作っていく方針。関数を組み合わせる一つの手法として合成や高階やモナドがあって、レキシカルスコープかつ副作用はなるべくない方が組み合わせやすい。オブジェクト指向だって個々のオブジェクトを「組み合わせて」全体の動きを作り上げますが、オブジェクトがアイデンティティを持って変化していくことが想定されている組み方とは違って、むしろアイデンティティを無くして入出力のみで組み合わせる。一言でいうとλ計算・・・と言いたいところなのだけど多値のSchemeもあるので保留。
- もう一つは、代数的データ型を入れてパターンマッチする方針。和と積と再帰によってインバリアントのないデータ構造を構築し、パターンマッチによって分解する。オブジェクト指向的には抽象データ型が推奨な感じでしたが、むしろ場合分けもガンガン使う。
その他にもリストを多用する文化も特徴なのですが、でも後出しじゃんけん的に考えると、リストが便利というのは先の二つの手法からの当然の帰結のように思えなくもないです。C言語で配列が便利だったのはアドレスを持ったメモリを想定していたから。その因果関係と似た感じ。
ちなみに、8月に開催する現場で活かす関数型プログラミング(F#編)でもこういった考え方に沿って具体例と一緒に解説する流れです。