射影型
射影型は、次のコードにおけるSelf.AddOのような型を表します。
Add R = Trait {
.`_+_` = Self, R -> Self.AddO
.AddO = Type
}
AddForInt = Patch(Int, Impl := Add Int)
AddForInt.
AddO = Int
Add(R)型は何らかのオブジェクトとの加算が定義されている型といえます。メソッドは型属性であるべきなので、+の型宣言はインデント以下に記述します。
Add型のミソとなるのが.AddO = Typeという宣言で、射影型である.AddO型の実体は、Addのサブタイプである型が持ちます。例えば、Int.AddO = Int, Odd.AddO = Evenです。
assert Int < Add
assert Int.AddO == Int
assert Odd < Add
assert Odd.AddO == Even