Concurrent Clean : CleanJ : 代数データ型

昨日の話([id:lethevert:20060527:p3])が良くわからなくなってきたので、代数データ型の例を作ってみた。

module Algebraic

import StdEnv, OptEnv

::Tree x = Leaf x | Branch [Tree x]

Start = sumTree $ Branch [Leaf 1, Leaf 2, Branch [Leaf 3, Leaf 4], Leaf 5]

sumTree (Leaf a) = a
sumTree (Branch ts) = sum ts
  where
    sum []     = 0
    sum [t:tr] = sumTree t + sum tr

と、これを書いていて、データ型もカリー化できることに気づいた。
それはともかく、eq_descの意味はこれでいいような気がする。

eq_desc データ型名 アリティ A-Stackインデックス

データ型名とアリティが等しければ、eq_descが真になる。データ型名をどこに置くかということさえ解決がつけば、データ型を配列としても問題なさそう。

      • -

さてさて、データ型名。これは、実質的にはeq_descでの比較のためだけに用意すればよいわけです。最初は、instanceofを使うのがJavaらしいかと思っていたのですが、eq_descでの比較のためだけということになれば、わざわざ新しいクラスを作るまでもない。

class Main {
  public final static Object Leaf = new Object();
}

というように、データ型名を持ったスタティックフィールドに、オブジェクトを一つ付けておいて、このオブジェクトを = で比較してやるのが最も高速。