aboutsummaryrefslogtreecommitdiff
path: root/sample/pseudo_higher_order/reduce.in
blob: 90ba14507ae953690a659bf96a4f320c4a6ad01f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// foldr, foldl functions


// target functions
// Here, we use built-in agents Add and Sub


// --------------------------------------------------------------------
// foldr f v [x0, x1, ..., xn] = f(x0, f(x1, ... f(xn-1, f(xn, v))...))
// --------------------------------------------------------------------
foldr(r, f, v) >< x:xs => foldr_Cons(r,f,v,x)~xs;
foldr_Cons(r,f,v,x) >< [] => f~((r,x),v);
foldr_Cons(r,f,v,x) >< y:ys => 
         Dup(f1,f2)~f,
         foldr(w, f2, v)~y:ys,
         f1~((r,x),w);

// --------------------------------------------------------------------
// foldl f v [x0, x1, ..., xn] = f( ... f(f(v,x0),x1) ..., xn)
// --------------------------------------------------------------------
foldl(r, f, v) >< x:xs => foldl_Cons(r,f,v,x)~xs;    
foldl_Cons(r,f,v,x) >< [] => f~((r,v),x);
foldl_Cons(r,f,v,x) >< y:ys => 
         Dup(f1,f2)~f,
         f1~((w,v),x),
         foldl(r, f2, w)~y:ys;




// ---------- main ---------- 

// foldr f v [x0, x1, ..., xn] = f(x0, f(x1, ... f(xn-1, f(xn, v))...))
// foldr plus 10 [1,2,3] = plus(1, plus(2, plus(3, 10))) = 16

foldr(r, %Add, 10) ~ [1,2,3];
r; free r; // r ->16


// foldr subt 1 [30,20,10] = subt(30, subt(20, subt(10, 1)))
//                       = 30-(20-(10-1)) = 30-(20-9) = 30-11 = 19

foldr(r, %Sub, 1) ~ [30,20,10];
r; free r; // r ->19



// foldl f v [x0, x1, ..., xn] = f( ... f(f(v,x0),x1) ..., xn)
// foldl plus 10 [1,2,3] = plus(3, plus(2, plus(1, 10))) = 16

foldl(r, %Add, 10) ~ [1,2,3];
r; free r; // r ->16


// foldl subt 10 [1,2,3] = subt(subt(subt(10,1),2),3) = ((10-1)-2)-3 = 4
foldl(r, %Sub, 10) ~ [1,2,3];
r; free r; // r ->4