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