TOP > プログラマ2.0日報 > 2007年10月31日

あすなろBlogger

facebookに投稿 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク このエントリーをはてなブックマークに追加 この記事をクリップ! livedoorclip ユーザー数 BuzzurlにブックマークBuzzurlにブックマーク この記事をtweetする

パターンマッチ駆動....

2007.10.31

さて、ちょっと勉強している Haskell の話題から。

この Haskell という言語は、要するに「モダンな Lisp」みたいな言語です。勿論、Lisp 以降の関数型言語研究を踏まえて、

  1. 1. 副作用のない純粋な関数型言語
  2. 2. ということは、「副作用」自体を関数型言語パラダイムに適応させた「モナド」という概念がある。
  3. 3. 遅延実行をサポートし、本当に必要になるまで式が評価されない。
  4. 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

カレンダー

<< 2007年10月 >>

  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最新のエントリー

最新のトラックバック

最新のコメント

Tag

バックナンバー