對,我有流氓這個數據類型:Rascal中的代數數據類型的繼承?
data Type = Any() | Void() | Int() | Not(Type l) | And(set[Type] es) | Or(set[Type] es);
我想要做的就是定義另一種類型是這樣的:
data Primitive = Any() | Void() | Int();
然後可以做這樣的事情:
Primitive p = Any();
Type d = p;
或者,例如,在簡化Type
時與Primitive
匹配。事情是這樣的:
public Type reduce(Not(Primitive p)) = p;
目前,我能看到的唯一的解決辦法就是擴大上述規則對每一種情況下,像這樣:
public Type reduce(Not(Any)) = Any();
public Type reduce(Not(Void)) = Void();
public Type reduce(Not(Int)) = Int();
我猜是有辦法做到這一點,但我還沒弄清楚......想法?
謝謝保羅。實際上,'isPrim'匹配程序看起來比使用單獨的'prim'構造函數更好。我會給它一個旋風。 – redjamjar