ushalow
[clean-tests.git] / expr / gadt.icl
1 module gadt
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 :: BM a b = {to :: a->b, fro :: b->a}
13 bm = {to=id,fro=id}
14 :: Expr a
15 = Lit (BM a Int) Int
16 | Var (BM a Int) String
17 | E.e: Plus (BM a e) (Expr a) (Expr a) & + e
18
19 eval :: (Expr Int) -> ([(String, Int)] -> Either String Int)
20 eval (Lit _ i) = const $ pure i
21 eval (Var _ s) = maybe (Left $ "Undefined variable " +++ s) Right o lookup s
22 eval (Plus _ a b) = \s->liftM2 (+) (eval a s) (eval b s)
23
24 print :: (Expr a) -> String
25 print (Lit _ i) = toString i
26 print (Var _ s) = s
27 print (Plus _ a b) = print a +++ " + " +++ print b
28
29 Start = eval (Plus bm (Lit bm 5) (Lit bm 37)) []