Generalized algebraic data type explained

In functional programming, a generalized algebraic data type (GADT, also first-class phantom type, guarded recursive datatype, or equality-qualified type) is a generalization of a parametric algebraic data type (ADT).

Overview

In a GADT, the product constructors (called data constructors in Haskell) can provide an explicit instantiation of the ADT as the type instantiation of their return value. This allows defining functions with a more advanced type behaviour. For a data constructor of Haskell 2010, the return value has the type instantiation implied by the instantiation of the ADT parameters at the constructor's application.

-- A parametric ADT that is not a GADTdata List a = Nil | Cons a (List a)

integers :: List Intintegers = Cons 12 (Cons 107 Nil)

strings :: List Stringstrings = Cons "boat" (Cons "dock" Nil)

-- A GADTdata Expr a where EBool :: Bool -> Expr Bool EInt :: Int -> Expr Int EEqual :: Expr Int -> Expr Int -> Expr Bool

eval :: Expr a -> aeval e = case e of EBool a -> a EInt a -> a EEqual a b -> (eval a)

(eval b)

expr1 :: Expr Boolexpr1 = EEqual (EInt 2) (EInt 3)

ret = eval expr1 -- False

They are currently implemented in the Glasgow Haskell Compiler (GHC) as a non-standard extension, used by, among others, Pugs and Darcs. OCaml supports GADT natively since version 4.00.[1]

The GHC implementation provides support for existentially quantified type parameters and for local constraints.

History

An early version of generalized algebraic data types were described by and based on pattern matching in ALF.

Generalized algebraic data types were introduced independently by and prior by as extensions to the algebraic data types of ML and Haskell. Both are essentially equivalent to each other. They are similar to the inductive families of data types (or inductive datatypes) found in Coq's Calculus of Inductive Constructions and other dependently typed languages, modulo the dependent types and except that the latter have an additional positivity restriction which is not enforced in GADTs.

introduced extended algebraic data types which combine GADTs together with the existential data types and type class constraints.

Type inference in the absence of any programmer supplied type annotation, is undecidable and functions defined over GADTs do not admit principal types in general. Type reconstruction requires several design trade-offs and is an area of active research (; .

In spring 2021, Scala 3.0 is released.[2] This major update of Scala introduce the possibility to write GADTs[3] with the same syntax as algebraic data types, which is not the case in other programming languages according to Martin Odersky.[4]

Applications

Applications of GADTs include generic programming, modelling programming languages (higher-order abstract syntax), maintaining invariants in data structures, expressing constraints in embedded domain-specific languages, and modelling objects.

Higher-order abstract syntax

An important application of GADTs is to embed higher-order abstract syntax in a type safe fashion. Here is an embedding of the simply typed lambda calculus with an arbitrary collection of base types, product types (tuples) and a fixed point combinator:

data Lam :: * -> * where Lift :: a -> Lam a -- ^ lifted value Pair :: Lam a -> Lam b -> Lam (a, b) -- ^ product Lam :: (Lam a -> Lam b) -> Lam (a -> b) -- ^ lambda abstraction App :: Lam (a -> b) -> Lam a -> Lam b -- ^ function application Fix :: Lam (a -> a) -> Lam a -- ^ fixed pointAnd a type safe evaluation function:eval :: Lam t -> teval (Lift v) = veval (Pair l r) = (eval l, eval r)eval (Lam f) = \x -> eval (f (Lift x))eval (App f x) = (eval f) (eval x)eval (Fix f) = (eval f) (eval (Fix f))The factorial function can now be written as:fact = Fix (Lam (\f -> Lam (\y -> Lift (if eval y

See also

Further reading

Applications
Semantics
Type reconstruction
Other

External links

Notes and References

  1. Web site: OCaml 4.00.1. ocaml.org.
  2. Web site: Kmetiuk . Anatolii . Scala 3 Is Here! . scala-lang.org . École Polytechnique Fédérale Lausanne (EPFL) Lausanne, Switzerland . 19 May 2021.
  3. Web site: Scala 3 – Book Algebraic Data Types . scala-lang.org . École Polytechnique Fédérale Lausanne (EPFL) Lausanne, Switzerland . 19 May 2021 . gadt-scala3.
  4. Web site: Odersky . Martin . A Tour of Scala 3 – Martin Odersky . https://ghostarchive.org/varchive/youtube/20211219/_Rnrx2lo9cw . 2021-12-19 . live . youtube.com . Scala Days Conferences . 19 May 2021 . scala3-tour.