|
@@ -75,5 +75,42 @@ treeMap f (Node a left right) = Node (f a) (treeMap f left) (treeMap f right)
|
|
|
|
|
|
-- defin the foldl function for a tree
|
|
-- defin the foldl function for a tree
|
|
treeFoldl :: (a -> b -> a) -> a -> Tree b -> a
|
|
treeFoldl :: (a -> b -> a) -> a -> Tree b -> a
|
|
-treeFoldl f z EmptyTree = z
|
|
|
|
|
|
+treeFoldl _ z EmptyTree = z
|
|
treeFoldl f z (Node a left right) = treeFoldl f (f (treeFoldl f z left) a) right
|
|
treeFoldl f z (Node a left right) = treeFoldl f (f (treeFoldl f z left) a) right
|
|
|
|
+
|
|
|
|
+-- define the foldr function on a tree
|
|
|
|
+
|
|
|
|
+treeFoldr :: (b -> a -> a) -> a -> Tree b -> a
|
|
|
|
+treeFoldr _ z EmptyTree = z
|
|
|
|
+treeFoldr f z (Node a left right) = treeFoldr f (f a (treeFoldr f z right)) left
|
|
|
|
+
|
|
|
|
+-- define a filter function on the tree
|
|
|
|
+
|
|
|
|
+treeFilter :: (a -> Bool) -> Tree a -> [a]
|
|
|
|
+treeFilter f = treeFoldr (\x acc -> if f x then x:acc else acc) []
|
|
|
|
+
|
|
|
|
+-- define the sumTree using treeFoldr
|
|
|
|
+
|
|
|
|
+treeSum2 :: (Num a) => Tree a -> a
|
|
|
|
+treeSum2 = treeFoldr (+) 0
|
|
|
|
+
|
|
|
|
+--define a the treeValues function on a tree using the treeFoldr
|
|
|
|
+
|
|
|
|
+treeValues3 :: Tree a -> [a]
|
|
|
|
+treeValues3 = treeFoldr (:) []
|
|
|
|
+
|
|
|
|
+--define the treeValues unction using the treeFoldl function
|
|
|
|
+
|
|
|
|
+treeValues4 :: Tree a -> [a]
|
|
|
|
+treeValues4 t = treeFoldl (++) [] (treeMap (:[]) t)
|
|
|
|
+
|
|
|
|
+--define a TrafficLight datatype implementing the equality operations and introducing a (partial) order
|
|
|
|
+
|
|
|
|
+data TrafficLight = Red | Yellow | Green
|
|
|
|
+
|
|
|
|
+instance Eq TrafficLight where
|
|
|
|
+ Red == red = True
|
|
|
|
+ Yellow == Yellow = True
|
|
|
|
+ Green == Green = True
|
|
|
|
+ _ == _ = False
|
|
|
|
+
|