Skip to content

Instantly share code, notes, and snippets.

@konn
Created August 28, 2010 03:36
Show Gist options
  • Save konn/554664 to your computer and use it in GitHub Desktop.
Save konn/554664 to your computer and use it in GitHub Desktop.
{-# LANGUAGE GADTs, TypeFamilies #-}
data GExpr a where
GInt :: Int -> GExpr Int
GPlus :: GExpr Int -> GExpr Int -> GExpr Int
GMult :: GExpr Int -> GExpr Int -> GExpr Int
GChar :: Char -> GExpr Char
GList :: [GExpr a] -> GExpr [a]
evalG :: GExpr a -> a
evalG (GInt i) = i
evalG (GPlus ei ej) = evalG ei + evalG ej
evalG (GMult ei ej) = evalG ei * evalG ej
evalG (GChar ch) = ch
evalG (GList xs) = map evalG xs
class Eval a where
data TFExpr a
evalTF :: TFExpr a -> a
instance Eval Int where
data TFExpr Int = TFInt Int
| TFPlus (TFExpr Int) (TFExpr Int)
| TFMult (TFExpr Int) (TFExpr Int)
evalTF (TFInt i) = i
evalTF (TFPlus ei ej) = evalTF ei + evalTF ej
evalTF (TFMult ei ej) = evalTF ei * evalTF ej
instance Eval Char where
data TFExpr Char = TFChar Char
evalTF (TFChar ch) = ch
instance Eval a => Eval [a] where
data TFExpr [a] = TFList [TFExpr a]
evalTF (TFList xs) = map evalTF xs
{-# LANGUAGE GADTs, TypeFamilies #-}
-- We can't write like that:
data family TFExpr a
data instance TFExpr Int = TFInt Int
| TFPlus (TFExpr Int) (TFExpr Int)
| TFMult (TFExpr Int) (TFExpr Int)
data instance TFExpr Char = TFChar Char
data instance TFExpr [a] = TFList [TFExpr a]
evalTF :: TFExpr a -> a
evalTF (TFInt i) = i
evalTF (TFPlus ei ej) = evalTF ei + evalTF ej
evalTF (TFMult ei ej) = evalTF ei * evalTF ej
evalTF (TFChar ch) = ch
evalTF (TFList xs) = map evalTF xs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment