パターンマッチ駆動....
2007.10.31
さて、ちょっと勉強している Haskell の話題から。
この Haskell という言語は、要するに「モダンな Lisp」みたいな言語です。勿論、Lisp 以降の関数型言語研究を踏まえて、
- 1. 副作用のない純粋な関数型言語
- 2. ということは、「副作用」自体を関数型言語パラダイムに適応させた「モナド」という概念がある。
- 3. 遅延実行をサポートし、本当に必要になるまで式が評価されない。
- 4. 「型クラス」の概念があって、変数型を自動で導出したりする。その上、「型クラス」はちょいとオブジェクト指向っぽく継承モデルを持っている。
...という具合に、いろいろと Lisp+ な機能がありますが、Lisp に特徴的な「データとプログラムの区別がない」というのはなしです。ですから、見た目上プログラムが prolog に近い格好になってたりします。たとえば階乗を求めるのだと、
Haskell
fac 0 = 1
fac n | n > 0 = n * fac (n-1)
Prolog
fact(0, 1).
fact(N, F) :-
N >0,
N1 is N-1,
fact(N1, F1),
F is N*F1.
という感じで似ているわけです。で、さらに、Haskell も Prolog も、いわゆる「リストのパターンマッチ」をします。たとえば、リストの長さを求める例だと、
Haskell
length [] = 0;
length (x:xs) = 1 + length xs
Prolog
length([], 0).
length([X|Y],Z) :- length(Y,W), Z is W + 1.
という感じで、(x:xs) も [X|Y] も、対象となるリストの「一番先頭の要素」:「それ以降の要素」を、パターンマッチで式の上で分解して指定する、という格好になります(で、それをさらに再適用してループを作ります)。
勿論 Prolog は関数型言語ではなく論理型言語ですから、バックトラックのような推論を持っていますけども、ここらへんの動作のキモは「パターンマッチによる再帰」ということなのです。
....で考えてみると、この「パターンマッチによる再帰」というのは、実はこういった超洗練言語たちに限ったことではなくて、たとえば XSLT でもあったりするわけです(ですから、最初 XSLT を勉強したとき、「何か Prolog に似てる~~」というのが私の感想)。こういうかっこいい書き方ではなくて、 XML で書くに過ぎませんが、やはり
<xsl:template match="item">
<xsl:value-of select="@value"/>
<xsl:apply-templates select="item"/>
</xsl:template>
のように、再帰的に自身を呼び出してパターンマッチを継続していくわけです....というように、「パターンマッチ駆動」というアイデアはかなり汎用的なものではないのでしょうか。
投稿者 : 杉浦 こずえ | 投稿日時 : 2007.10.31 17:17





