Skip to content

Instantly share code, notes, and snippets.

@vijayanant
Created April 8, 2020 03:45
Show Gist options
  • Save vijayanant/ccc92a32298c1625b9828b061b5c4a5d to your computer and use it in GitHub Desktop.
Save vijayanant/ccc92a32298c1625b9828b061b5c4a5d to your computer and use it in GitHub Desktop.
GADT Code Samples
data Point = Pt Int Int
data Expr a = Number Integer | Boolean Bool
ghci> let a = Number 10
ghci> let b = Boolean True
ghci> :t a
a :: Expr
ghci> :t b
b :: Expr
ghci> :t Number
Number :: Integer -> Expr
ghci> :t Boolean
Boolean :: Bool -> Expr
data Expr = Number Int
| Succ Expr
| IsZero Expr
| If Expr Expr Expr
data Value = IntVal Int | BoolVal Bool
eval :: Expr -> Value
eval (Number i) = IntVal i
eval (Succ e) = case eval e of
IntVal i -> IntVal (i+1)
eval (IsZero e) = case eval e of
IntVal i -> BoolVal (i==0)
eval (If b e1 e2) = case eval b of
BoolVal True -> eval e1
BoolVal False -> eval e2
expr1 = Succ (Number 1) -- valid and type checks
expr2 = Succ (IsZero (Number 1)) -- invalid but type checks
{-# LANGUAGE GADTs #-}
data Expr a where
Number :: Int -> Expr Int
Succ :: Expr Int -> Expr Int
IsZero :: Expr Int -> Expr Bool
If :: Expr Bool->Expr a->Expr a->Expr a
ghci> :t Succ (Number 10)
Succ (Number 10) :: Expr Int
ghci> :t Succ (IsZero (Number 0))
<interactive>:1:7: error:
Couldn’t match type Bool with Int
Expected type: Expr Int
Actual type: Expr Bool
In the first argument of Succ, namely (IsZero (Number 0))
In the expression: Succ (IsZero (Number 0))
eval :: Expr a -> a
eval (Number i) = i
eval (Succ e) = 1 + eval e
eval (IsZero e) = 0 == eval e
eval (If b e1 e2) = if eval b then eval e1 else eval e2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment