summaryrefslogtreecommitdiff
path: root/tryouts
diff options
context:
space:
mode:
authorCamil Staps2016-04-21 20:14:02 +0200
committerCamil Staps2016-04-21 20:14:02 +0200
commitc9f136782524084ecc89b2f190ab92ff3feb25d7 (patch)
treec811b8d88e20e406c0eb59986dab7c36986aad12 /tryouts
parentOpdracht 1 (diff)
Removed stuff
Diffstat (limited to 'tryouts')
-rw-r--r--tryouts/fold.icl40
1 files changed, 40 insertions, 0 deletions
diff --git a/tryouts/fold.icl b/tryouts/fold.icl
new file mode 100644
index 0000000..26967d2
--- /dev/null
+++ b/tryouts/fold.icl
@@ -0,0 +1,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)
+