関数型言語のよいところ
「美しい」(*1)とか言うのはなしにして、関数型言語の実際的なよいところを考えてみる。(Concurrent Cleanの文法を念頭においているので、他の関数型言語だと当てはまらないかも。)
- 型推論によって、静的型付けにも関わらず、ローカル変数を宣言なしに使える
- タプルによって、複数の値の組を返す関数を簡単に作成できる(*2)
- パターンマッチによって、場合わけを見通しのよい(可読性の高い)方法で表現できる
- ローカルスコープを入れ子にして、必要なだけ定義できる
- 概念的な単位で関数を分割して記述しやすい
というところでしょうか?
2
タプルは、ローカルスコープの関数からアドホックに複数の値の組を返すには最適の仕組みです。グローバルスコープの関数でも有効ですけど、グローバルスコープならレコードを定義してやっても悪くはないと思います。ただし、タプルもレコードもないJavaのような言語だと、そのためにクラスを定義しなければならなくなって微妙です。CやDelphiだと、複数の値を返すには、レコードを使わずに、参照渡しを使うことも多いと思いますが、これは副作用が不透明になりがちで気持ち悪いと思います。タプルは、こういう気持ちの悪さから解放してくれます。(*2)
4,5
ローカルスコープに定義した関数が、グローバルスコープのものと同じようにfirst-class objectとして扱えるのは、便利です。(Delphiとかは、関数内関数は関数ポインタに代入できないという制限があったりして、グローバルスコープとは違う扱いになったりするんですね。CやJavaはローカルスコープに関数を定義する機能そのものがないですし。)
注
*1 数学的な美しさって、単純な規則の組み合わせで、いかに複雑なシステムを表現できるかというところにあると思うのだけれど、プログラミングの美しさは、この数学的な美しさの概念を強く踏襲していると思う。
*2 追記(on 27/Jul/2005)