Maybe fmap no longer edits input
[cc1516.git] / examples / demo / maybe.spl
1 //poor mans maybe
2 //(1, a) = Just a
3 //(0, _) = Nothing
4
5 pure(a) :: a -> (Int, a) {
6 return (1, a);
7 }
8
9 fmap(f, ma) :: (a -> b) -> (Int, a) -> (Int, b) {
10 var t = ma.snd; //copy to avoid editing ma by reference
11 if (ma.fst == 0) { return ma; }
12 else {
13 t = f(ma.snd);
14 return (ma.fst, t);
15 }
16 }
17
18
19 bind(ma, f) :: (Int, a) -> (a -> (Int, b)) -> (Int, b) {
20 if (ma.fst == 0) { return ma; }
21 else {
22 return f(ma.snd);
23 }
24 }
25
26 main() {
27
28 var j = pure(True);
29 var n = (0, False); //ugly that we need the additional parameter
30
31 var jf = fmap(\b->!b, j);
32 var nf = fmap(\b->!b, n);
33
34 var fma = \b -> pure(!b);
35
36 var bjf = bind(j, fma);
37 bar bnf = bind(n, fma);
38
39 print("fmap Just false: ", jf.fst, jf.snd, "\n");
40 print("fmap Nothing: ", nf.fst, "\n");
41
42 print("bind Just False: ", bjf.fst, bjf.snd, "\n");
43 print("bind Nothing: ", bnf.fst, "\n");
44 }