7 import Control.Applicative
10 lit :: i -> v i | toString i
11 (+.) infixl 6 :: (v i) (v i) -> v i | + i
13 instance + (v a) | expr v & + a where
16 eval :: (Maybe a) -> Maybe a
18 instance expr Maybe where
20 +. x y = (+) <$> x <*> y
22 :: Print a =: Print String
23 print :: (Print a) -> String
25 instance expr Print where
26 lit i = Print (toString i)
27 +. (Print l) (Print r) = Print (l +++ "+" +++ r)
29 printEval :: (A.v: v a | expr v) -> (Maybe a, String)
30 //printEval f = (f, let (Print p) = f in p)
31 printEval f = (eval f, print f)
34 //Start :: (Maybe Int, String)
35 //Start = printEval (lit 4 + lit 38)
38 Start = let (Print f) = lit 4 + lit 38 in f