ushalow
[clean-tests.git] / old / expr / class.icl
1 implementation module class
2
3 import StdEnv
4 import Data.Func
5 import Data.Functor
6 import Data.Either
7 import Data.List
8 import Data.Maybe
9 import Control.Applicative
10 import Control.Monad
11
12 //Easy to add functionality
13 //Easy to add backends
14 //Type safety as in GADTs
15
16 class lit m :: Int -> m
17 class var m :: String -> m
18 class (+.) infixl 6 m :: m m -> m
19
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)
24
25 :: Print :== String
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
29
30 Start :: Eval
31 Start = (lit 5 +. lit 37)