6 import Control.Applicative
9 lit :: i -> v i | toString i
10 (+.) infixl 6 :: (v i) (v i) -> v i | + i
12 instance + (v a) | expr v & + a where
15 eval :: (Maybe a) -> Maybe a
17 instance expr Maybe where
19 +. x y = (+) <$> x <*> y
21 :: Print a =: Print String
22 print :: (Print a) -> String
24 instance expr Print where
25 lit i = Print (toString i)
26 +. (Print l) (Print r) = Print (l +++ "+" +++ r)
28 printEval :: (A.v: v a | expr v) -> (Maybe a, String)
29 printEval f = (eval f, let (Print p) = f in p)
32 Start :: (Maybe Int, String)
33 Start = printEval (lit 4 +. lit 38)
36 //Start = let (Print f) = lit 4 + lit 38 in f