Open Union
拡張可能(Open)な、Union型
a type-indexed coproduct of functors
特にpackageが必要というわけでもない
拡張可能な、Union型である
だから、OpenなUnion
hsdata Value
= Unit ()
| Bool Bool
| Integer Integer
| Char Char
そうすれば [Value]
とすることで、複数の型を含んだリストを作ることができる
しかし、これはあとから拡張ができない
いわばClosed Unionである

hsdata UnionValue = forall x . UnionValue x
この UnionValue
型は、Unionである Value
型を拡張可能にしたものと見なせる
hsvalue :: [UnionValue]
value = [ UnionValue (123 :: Integer)
, UnionValue True
, UnionValue ()
, UnionValue 'c'
]
value' :: [UnionValue]
value' = value ++ [UnionValue (123 :: Double)]
存在型の定義の仕方を工夫すれば、「MonadのみのOpen Union」なども定義できる
いくつかのGHC拡張を使うことで、拡張可能な型レベルリストを構成できる
hsdata UnionValue (as :: [*]) = forall a . UnionValue Word a
type A = UnionValue '[Int, Bool]
type B = UnionValue '[Int, Bool, String]
A
から B
への変化を見れば分かる通り、これもOpen Unionである
UseCase層にて、Repository層の関数が返す複数種類のエラーを扱うためにOpen Unionを用いている