cloud
[clean-tests.git] / test.icl
1 module test
2
3 import StdEnv
4 import Data.Maybe
5 import Data.Functor
6 import Control.Monad
7 import Control.Applicative
8
9 class expr v where
10 lit :: i -> v i | toString i
11 (+.) infixl 6 :: (v i) (v i) -> v i | + i
12
13 instance + (v a) | expr v & + a where
14 + l r = l +. r
15
16 eval :: (Maybe a) -> Maybe a
17 eval x = x
18 instance expr Maybe where
19 lit i = Just i
20 +. x y = (+) <$> x <*> y
21
22 :: Print a =: Print String
23 print :: (Print a) -> String
24 print (Print a) = a
25 instance expr Print where
26 lit i = Print (toString i)
27 +. (Print l) (Print r) = Print (l +++ "+" +++ r)
28
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)
32
33 //Mag niet
34 //Start :: (Maybe Int, String)
35 //Start = printEval (lit 4 + lit 38)
36
37 //Mag wel
38 Start = let (Print f) = lit 4 + lit 38 in f