generated at
Open Union
拡張可能(Open)な、Union型



a type-indexed coproduct of functors



Open Unionを便利に扱うpackage


ExistentialQuantificationなどを有効にすれば扱える
特にpackageが必要というわけでもない



拡張可能な、Union型である
だから、OpenなUnion
普通にHeterogenous collectionsを作るにはこういう型を定義しておけばいい
hs
data Value = Unit () | Bool Bool | Integer Integer | Char Char
そうすれば [Value] とすることで、複数の型を含んだリストを作ることができる
しかし、これはあとから拡張ができない
いわばClosed Unionであるmrsekut
存在型を使うことで、あとから拡張可能なHeterogenous collectionsを作ることができる
hs
data UnionValue = forall x . UnionValue x
この UnionValue 型は、Unionである Value 型を拡張可能にしたものと見なせる

hs
value :: [UnionValue] value = [ UnionValue (123 :: Integer) , UnionValue True , UnionValue () , UnionValue 'c' ] value' :: [UnionValue] value' = value ++ [UnionValue (123 :: Double)]
存在型の定義の仕方を工夫すれば、「MonadのみのOpen Union」なども定義できる
いくつかのGHC拡張を使うことで、拡張可能な型レベルリストを構成できる
hs
data 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を用いている

Trees that Growとの関係 #??