rank2
[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) -> (Maybe a, String)
29 printEval f = (eval f, let (Print p) = f in p)
30
31 //Mag niet
32 Start :: (Maybe Int, String)
33 Start = printEval (lit 4 +. lit 38)
34
35 //Mag wel
36 //Start = let (Print f) = lit 4 + lit 38 in f