summaryrefslogtreecommitdiff
path: root/tryouts/fold.icl
blob: 26967d23017eadba54be00c40747fae3308dfb04 (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
module fold

import StdEnv

:: List a = Nil | Cons a (List a)

(~>) infixr 4 :: (a (List a) -> List a)
(~>) = Cons

foldr :: (a -> b -> b) b (List a) -> b
foldr f x Nil = x
foldr f x (Cons a l) = f a (foldr f x l)

map :: (a -> b) -> (List a) -> (List b)
map f = foldr (Cons o f) Nil

sum = foldr (+) zero
product = foldr (*) one

any = foldr (||) False
all = foldr (&&) True

copy = foldr Cons Nil
append a b = foldr Cons b a
length = foldr (\_ n -> n + 1) 0

:: Tree a = Node a (List (Tree a))

(@) infixr 4 :: (a (List (Tree a)) -> Tree a)
(@) = Node

foldtree :: (a -> b -> c) (b -> c -> b) b (Tree a) -> c
foldtree f g a (Node l ts) = f l (foldtree` f g a ts)
where
    //foldtree` :: (a -> b -> c) (c -> b -> b) b (List (Tree a)) -> b ??
    foldtree` f g a (Cons t r) = g (foldtree f g a t) (foldtree` f g a r)
    foldtree` f g a Nil = a

Start = map ((*)2) (5 ~> 10 ~> Nil)