{-# LANGUAGE GADTs #-}
data Calc a where
CInt :: Int -> Calc Int
CBool :: Bool -> Calc Bool
Eq :: (Eq a) => Calc a -> Calc a -> Calc Bool
-- ^^^^^^^^^ Why do I need the context?
eval :: Calc a -> a
eval (CInt i) = i
eval (CBool b) = b
eval (Eq a b) = eval a == eval b