1 {-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, ConstraintKinds #-}
4 import Prelude hiding (print)
5 import Data.Functor.Identity
10 main = putStrLn $ show (unP e1 [])
19 lit :: (c a) => a -> v a
20 (+.) :: (c a, Num a) => v a -> v a -> v a
21 (-.) :: (c a, Num a) => v a -> v a -> v a
22 (*.) :: (c a, Num a) => v a -> v a -> v a
23 (==.) :: (c a, Eq a) => v a -> v a -> v Bool
24 -- if' :: (c a) => v Bool -> v a -> v a -> v a
26 data Printer a = P ([String] -> [String])
28 instance Expr Printer Show where
30 l +. r = P $ unP l . ("+":) . unP r
31 l -. r = P $ unP l . ("-":) . unP r
32 l *. r = P $ unP l . ("*":) . unP r
33 l ==. r = P $ unP l . ("==":) . unP r
34 -- if' i t e = P $ ("if ":) . unP i . (" then ":) . unP t . (" else ":) . unP e
38 instance Expr Eval Empty where
40 l +. r = E $ unE l + unE r
41 l -. r = E $ unE l - unE r
42 l *. r = E $ unE l * unE r
43 l ==. r = E $ unE l == unE r
44 -- if' i t e = if unE i then t else e