module test import StdEnv class expr v c where lit :: a -> v (c a) //class plus v c //where // (+.) infixl 6 :: (v c a) (v c a) -> v c a | + a :: BM x y = { to :: x -> y, fro :: y -> x } bm :: BM a a bm = {to=id, fro=id} :: ToString a = E.e: ToString (BM a e) & toString e :: Printer a = P a ([String] -> [String]) :: PrintConstraints a = E.e: PC (BM a e) & toString e print :: (Printer (PrintConstraints a)) -> [String] print (P _ a) = a [] instance expr Printer PrintConstraints where lit a = P (PC bm) \c->[toString (bm.to a):c] //instance plus Printer PrintConstraints //where // (+.) (P l) (P r) = P \c->["(":l ["+":r [")":c]]] //:: Eval c a = E a | EBlurp (c a) //:: EvalConstraints a = EC a //eval :: (Eval EvalConstraints a) -> a //eval (E a) = a // //instance expr Eval EvalConstraints //where // lit a = E a //instance plus Eval PrintConstraints //where // (+.) (E l) (E r) = E (l + r) Start = print t where t = lit 42