module test import StdEnv import Data.Maybe import Data.Functor import Control.Applicative class expr v where lit :: i -> v i | toString i (+.) infixl 6 :: (v i) (v i) -> v i | + i instance + (v a) | expr v & + a where + l r = l +. r eval :: (Maybe a) -> Maybe a eval x = x instance expr Maybe where lit i = Just i +. x y = (+) <$> x <*> y :: Print a =: Print String print :: (Print a) -> String print (Print a) = a instance expr Print where lit i = Print (toString i) +. (Print l) (Print r) = Print (l +++ "+" +++ r) //printEval :: (A.v: v a | expr v & + (v Int)) -> (Maybe a, String) //printEval :: (A.v: v a | expr v & + (v Int)) -> (Maybe a, String) //printEval f = (eval f, print f) printEval` :: (v a) (w a) -> (Maybe a, String) | expr v & expr w printEval` f1 f2 = (eval f1, print f2) printEval f :== printEval` f f //x = lit 4 + lit 28 //y = lit 4 +. lit 28 //Mag niet //Start = printEval (lit 4 +. lit 38) Start :: (Maybe Int, String) //Start = printEval (lit 2 + lit 40) Start = printEval` expr expr //Start = printEval expr expr :: v Int | expr v & + (v Int) expr = lit 4 + lit 38 //Start = printEval (lit 4 +. lit 38) //Start = eval (lit 4 + lit 38) //Mag wel //Start = print (lit 4 + lit 38)