6 | Node (Tree a) a (Tree a)
10 leaf x = Node Empty x Empty
12 treeSize :: Tree a -> Integer
14 treeSize (Node l _ r) = 1 + treeSize l + treeSize r
16 treeSum :: Tree Integer -> Integer
18 treeSum (Node l x r) = x + treeSum l + treeSum r
20 treeDepth :: Tree a -> Integer
22 treeDepth (Node l _ r) = 1 + max (treeDepth l) (treeDepth r)
24 flatten :: Tree a -> [a]
26 flatten (Node l x r) = flatten l ++ [x] ++ flatten r
29 -- 0. empty case value
30 -- 1. type of the return value.
31 -- 2. how to combine the recursive calls.
33 treeFold :: b -> (b -> a -> b -> b) -> Tree a -> b
34 treeFold e _ Empty = e
35 treeFold e f (Node l x r) = f (treeFold e f l) x (treeFold e f r)
37 treeSize' :: Tree a -> Integer
38 treeSize' = treeFold 0 (\l _ r -> 1 + l + r)
40 treeSum' :: Tree Integer -> Integer
41 treeSum' = treeFold 0 (\l x r -> x + l + r)
43 treeDepth' :: Tree a -> Integer
44 treeDepth' = treeFold 0 (\l _ r -> 1 + max l r)
46 flatten' :: Tree a -> [a]
47 flatten' = treeFold [] (\l x r -> l ++ [x] ++ r)