部分型付けにおいては、型の「結び」が存在することが望ましい
ユニオン型とバリアント型は違う。
ユニオン型は単に複数の型の「いずれか」を表すため、昇格は手動でする必要がある。
一方バリアント型は、そのバリアント型自身に紐付けられたコンストラクタから構成されている。
data Either a = Left a | Right a
のLeft
とRight
はEither
に不可分に紐付いている。Left 0 から Either Int への型推論は構文主導で行うことが出来る。
一方ユニオン型は、union AorB = A | B
という擬似コードがあったとして、型Aの値はまずAに昇格される。A ≤ AorB
は真だが、Aを含むユニオン型は無数に存在するために、AorB
へと一意に昇格することは出来ない。
この問題点は、型クラスを実装する際に現れる。例えばBool = true | false
というよるにユニオン型として宣言してしまうと、Show
型クラスのインスタンスとしたとき、(show true)
のtrue
が含まれうる、プログラム中に含まれるすべての既存のユニオン型からBool
を推論しないといけない。これは同様に、Vec2 = [Int Int]
とした場合にも起こる。(Haskellはタプルの型クラス実装もあるが…)
こうする。
1
≤ Int
≤ All
Nothing
≤ Maybe a
≤ All