stupid higher order functions
[cc1516.git] / examples / higher.spl
1 map(f, l){
2 if(isEmpty(l)){
3 return [];
4 } else {
5 return f(l.hd) : map(f, l.tl);
6 }
7 }
8
9 foldr(f, acc, l){
10 if(isEmpty(l)){
11 return acc;
12 } else {
13 return foldr(f, f(acc, l.hd), l.tl);
14 }
15 }
16
17 filter(f, l){
18 if(isEmpty(l)){
19 return [];
20 } else {
21 if(f(l.hd)){
22 return filter(f, l.tl);
23 } else {
24 return l.hd : filter(f, l.tl);
25 }
26 }
27 }
28
29 intList(x){
30 if(x <= 1){
31 return [x];
32 } else {
33 return x : intList(x-1);
34 }
35 }
36
37 giveF(){
38 return (\x->x+1);
39 }
40
41 plus(x, y){
42 return x + y;
43 }
44
45 ap(f, x) { return f(x); }
46
47 mapF(f, xs) {
48 if(isEmpty(xs)) {
49 return [];
50 } else {
51 return (ap(f, xs.hd)) : mapF(f, xs.tl);
52 }
53 }
54
55 main(){
56 var x = 5;
57
58 var f = giveF();
59
60 var plus = \x y->x+y;
61
62 var g = map(plus, [1,2,3]);
63 var is = mapF(\f->f(1), g);
64 //var is = map(\f->f(1), g);
65 var p = g.hd;
66 var q = p(1);
67
68 //print("is.hd", is.hd);
69
70 print("f(4) = ", f(4));
71
72 print("faculty of 5 is: ", foldr(\x y->x*y, 1, intList(5)));
73 print("sum of 1..5 is: ", foldr(\x y->x+y, 0, intList(5)));
74 print("sum of 0..12 but only the evens: ",
75 foldr(\x y->x+y, 0, filter(\x->x%2 == 0, intList(12))));
76
77
78 }