関数型言語

うちの研究室の正式名称は計算機言語学講座であり,もうひとつの講座は実際に言語を研究している.彼らは関数型言語という,アカデミックでない人,とくに文系からシステムエンジニアなどをやっている人にとっては恐らくなじみのない言語をやっている.
彼らが言うにはオブジェクト指向も所詮は手続き型の言語であり(あるいはその亜流であり),駄目だという.例えば,手続き型言語のおなじみといえば「変数への(破壊的)代入」がある*1.これが関数型言語にはない.つまり,関数の引数渡しと戻り値の設定しかない.ローカル変数やグローバル変数などというものもない.ifは存在するがループがない.すべて再帰で表現しなければならい.
関数型言語を学んだときはかなり衝撃を受けた.これでほんとうにいろんなプログラムを書くことができるのか.不思議でしかたがないが,実際に可能なのである.可能なことがラムダ計算を中心とした理論で証明済みなのだ.
「・・・・できない」ということばかり書いているので,まるで機能がないように感じてしまうが,そうではなく,できないことによるいいことも多い.つまりこれらの機能は,実は世の中で書かれている大半の駄目なソースの一因にもなっている.これらに足かせをされると彼らは下手なソースを1行もかけなくなってしまうだろう.これはすばらしいかもしれない*2.半端な勉強ではプログラムが書けないのだ.
授業でいっていたのは,どのように処理するか,ではなく,何を処理したいのかという定義を書けば,あとは自動的にコンピュータが処理してくれる.というのが関数型言語の真髄らしい.すばらしい,すばらしいが,すっかり手続きになれてしまった私にはオブジェクト指向を勉強するよりも辛かった.
オブジェクト指向は確かに,所詮,処理(手続き)の所属先をオブジェクトに変更したにすぎない.あとはなにもかわらん.もちろん,クラスや継承などこまかなものがあるが,これらはオブジェクトに分散した定義をより効率的に記述する方法にすぎない.何も変わらないのだ.
いや,単に私が関数型言語について詳しくないから過剰な期待をしているだけかもしれない.でも,HaskellやML,Schemeなどの言語は勉強する価値は十分にあるだろう.

*1:破壊的というのは関数型言語支持者によるネガティブな言い回しかもしれない

*2:やや期待しすぎかも