1 implementation module class
9 import Control.Applicative
12 //Easy to add functionality
13 //Easy to add backends
14 //Type safety as in GADTs
16 class lit m :: Int -> m
17 class var m :: String -> m
18 class (+.) infixl 6 m :: m m -> m
20 :: Eval :== ([(String, Int)] -> Either String Int)
21 instance lit Eval where lit i = pure (pure i)
22 instance var Eval where var s = maybe (Left $ "Undefined variable " +++ s) Right o lookup s
23 instance +. Eval where (+.) a b = \s->liftM2 (+) (a s) (b s)
26 instance lit Print where lit i = toString i
27 instance var Print where var s = s
28 instance +. Print where (+.) a b = a +++ " + " +++ b
31 Start = (lit 5 +. lit 37)