Generalized Algebraic Data Types
#型
一般化代数的データ型。GADTsとも。
一般化代数データ型(GADTs)は、コンストラクタがより豊富な戻り型を持つことを可能にすることで、通常の代数データ型を一般化したもの
6.4.9. Generalised Algebraic Data Types (GADTs) — Glasgow Haskell Compiler 9.15.20260306 User's Guide
従来のAlgebraic Data Types(ADTs)を一般化し、より強力な表現力を得た存在
その代償として、型推論がちょっと辛くなる?らしい
Scalaにおいては、enumによるADTsに型パラメータがついた形
典型的な活用例としては、計算式の記述を型安全に行える:
code:scala
enum ExprA:
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