ユニオン型とバリアント型

部分型付けにおいては、型の「結び」が存在することが望ましい

ユニオン型とバリアント型は違う。

ユニオン型は単に複数の型の「いずれか」を表すため、昇格は手動でする必要がある。

一方バリアント型は、そのバリアント型自身に紐付けられたコンストラクタから構成されている。

data Either a = Left a | Right a

LeftRightEitherに不可分に紐付いている。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はタプルの型クラス実装もあるが…)

型クラスを持つことができる型を制限する

こうする。

1IntAll

NothingMaybe aAll