GADT
Generalized Algebraic Data type
一般化代数データ型
通常のADTでは、全てのコンストラクタが共通の型引数を共有するが、
GADTを使用すると、各コンストラクタが異なる型を持つことができる
例として、単純な数式を表す型を書いてみる
通常の構文で書くと以下のように書ける
code:hs
data Expr a = Val a
| Add (Expr a) (Expr a)
ただし、これには少し問題がある
今のままだと、任意の型aを足し算することが許されてしまう
そこで、aを具体化してIntとしてみる
code:hs
data Expr a = Val Int
| Add (Expr Int) (Expr Int)
これと全く等価なものGADTを使って書くと以下のようになる
code:Hs
data Expr a where
Val :: Int -> Expr Int
Add :: Expr Int -> Expr Int -> Expr Int
ここに、新たにIfやEqなどの命令を追加する
code:hs
data Expr a where
Val :: Int -> Expr Int
Add :: Expr Int -> Expr Int -> Expr Int
Eq :: Expr Int -> Expr Int -> Expr Bool
If :: Expr Bool -> Expr a -> Expr a -> Expr a
これはGADTでないと、このように定義できない
仮に、通常の書き方をするなら以下のようにしか書けない
code:hs
data Expr = Val Int
| Add Expr Expr
| Eq Expr Expr
| If Expr Expr Expr
しかし、こうすると型安全でないのでIf (Val 1) (Val 2) (Val 3)のような間違った式を作れてしまう
つまり、
通常のADTだと、型引数aを取ったとき、全ての値コンストラクタに対して共通のaを使うことになる。
GADTを使うと、値コンストラクタごとに異なるものを指定することができる
この説明で、Generalized ADTがADTの一般化であることがわかると思うmrsekut.icon
#WIP
DataKindsしたノリで値コンストラクタを定義できるのかmrsekut.icon
1行ごとに値コンストラクタを定義する
purs
https://medium.com/@hgiasac/purescript-gadts-alternatives-recap-7960daf4acd8
http://code.slipthrough.net/2016/08/10/approximating-gadts-in-purescript/
https://gist.github.com/throughnothing/f4577d5a47a421c63c3bff06411e25b9
参考
GADT · shiatsumat/wiwinwlh-jp Wiki
わかりやすい解説
http://nebuta.hatenablog.com/entry/2013/07/28/062609
実装例など
https://wiki.haskell.org/Generalised_algebraic_datatype
https://en.wikipedia.org/wiki/Generalized_algebraic_data_type
https://susisu.hatenablog.com/entry/2020/05/03/020854
https://qiita.com/dico_leque/items/58b864074049a6e33d92
https://faithandbrave.hateblo.jp/entry/20111201/1322718742
https://en.wikibooks.org/wiki/Haskell/GADT
https://keigoi.hatenadiary.org/entry/20090719/1247987134
https://www.slideshare.net/osiire/gadt
https://tech.ovoenergy.com/what-the-f-is-a-gadt/
http://en.wikibooks.org/wiki/Haskell/GADT
https://www.fpcomplete.com/blog/monads-gats-nightly-rust/
rust
https://jackh726.github.io/rust/2022/05/04/a-shiny-future-with-gats.html
rust
https://zenn.dev/mod_poppo/books/haskell-type-level-programming/viewer/gadts
https://las.rs/blog/all-you-need-is-hkt-s.html