Created: 2023-01-12 16:31
Generalized algebraic data type
generalization of parametric algebraic data types
data Expr a where
ExpBool :: Bool -> Expr Bool
ExpInt :: Int -> Expr Int
ExpEqual :: Expr Int -> Expr Int -> Expr BoolBy pattern matching on a GADT (on the value level) we discover some information about it from the type level. This is not the case with regular ADTs. Here’s an extended example A little type checker
Example, given the following definition of natural numbers and Vector.
data Nat = Zero | Succ Nat
data Vec :: Type -> Nat -> Type where
Nil :: Vec a 'Zero
Cons :: a -> Vec a n -> Vec a ('Succ n)We can define a total head function that doesn’t require pattern matching on the Nil case, since there will never be a Nil case.
head :: Vec a ('Succ n) -> a
head :: (Cons x _) = xAnd pattern matching on Nil would result in an error, since GHC knows that 'Succ a has no Nil case.
head :: Vec a ('Succ n) -> a
head :: Nil = _