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