{-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE EmptyDataDecls #-} -- | A simple arithmetic expression, its family and some instances. module Expr (Expr(..), ExprFam(..)) where import Prelude hiding (Num) import Eq1 import ShowFam import Generics.MultiRec.Base import Generics.MultiRec.TH -- | A simple arithmetic expression. data Expr = Num Int | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr deriving (Eq, Show) -- | The singleton data family for arithmetic expressions. Implements 'PF'. data ExprFam :: * -> * where Expr :: ExprFam Expr instance Show (ExprFam a) where show Expr = "Expr" instance ShowFam ExprFam where showFam Expr = show instance Eq1 ExprFam where eq1 Expr Expr = Just Refl $(deriveConstructors [''Expr]) $(deriveSystem ''ExprFam [''Expr] "PFExprFam") type instance PF ExprFam = PFExprFam