Generalized Algebraic Data Types
一般化代数的データ型。GADTsとも。
一般化代数データ型(GADTs)は、コンストラクタがより豊富な戻り型を持つことを可能にすることで、通常の代数データ型を一般化したもの
その代償として、型推論がちょっと辛くなる?らしい
Scalaにおいては、enumによるADTsに型パラメータがついた形
典型的な活用例としては、計算式の記述を型安全に行える:
code:scala
case LitBool(bool: Boolean) extends ExprBoolean case LitInt(int: Int) extends ExprInt case Ternary(bool: ExprBoolean, ifTrue: ExprInt, ifFalse: ExprInt) extends ExprInt Ternary(LitBool(false), LitInt(42), LitInt(666)) // legal
Ternary(LitInt(42), ???, ???) // illegal