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 & + (v Int)) -> (Maybe a, String)
29 //printEval :: (A.v: v a | expr v & + (v Int)) -> (Maybe a, String)
30 //printEval f = (eval f, print f)
32 printEval` :: (v a) (w a) -> (Maybe a, String) | expr v & expr w
33 printEval` f1 f2 = (eval f1, print f2)
35 printEval f :== printEval` f f
41 //Start = printEval (lit 4 +. lit 38)
42 Start :: (Maybe Int, String)
43 //Start = printEval (lit 2 + lit 40)
44 Start = printEval` expr expr
45 //Start = printEval expr
47 expr :: v Int | expr v & + (v Int)
49 //Start = printEval (lit 4 +. lit 38)
51 //Start = eval (lit 4 + lit 38)
54 //Start = print (lit 4 + lit 38)