```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 ``` ```data Tree a = Node (Tree a) (Tree a) | Leaf a | Empty deriving (Show) main = do let my_tree = Node (Node (Leaf [1,2,4,9]) (Leaf [0,3,5,5,8,5])) (Leaf [2,7,5,5,2]) print(cc_2 my_tree) print(cc_2 my_tree) bb my_tree aa my_tree cc my_tree print("Done") cc tree = print(tree) bb tree = print(fmap2 f \$ tree) aa tree = print(fmap3 h \$ tree) cc_2 tree = [ reduce (+) (fmap2 length tree) , reduce (min) (fmap2 minimum tree) , reduce (max) (fmap2 maximum tree) ] f :: [Int] -> [Int] f param = map mm param mm :: Int -> Int mm param = param + 2 h param = [length param,minimum param,maximum param] instance MyFunctor Tree where fmap2 ff (Node l r) = Node (fmap2 ff l) (fmap2 ff r) fmap2 ff (Leaf x) = Leaf (ff x) fmap3 ff (Node l r) = Node (fmap2 ff l) (fmap2 ff r) fmap3 ff (Leaf x) = Leaf (ff x) class MyFunctor ff where fmap2 :: (a -> b) -> ff a -> ff b fmap3 :: (a -> [Int]) -> ff a -> ff [Int] reduce ff (Node l r) = ff (reduce ff l) (reduce ff r) reduce ff (Leaf x) = x ```
 ```1 2 3 4 5 6 ``` ```[15,0,9] [15,0,9] Node (Node (Leaf [3,4,6,11]) (Leaf [2,5,7,7,10,7])) (Leaf [4,9,7,7,4]) Node (Node (Leaf [4,1,9]) (Leaf [6,0,8])) (Leaf [5,2,7]) Node (Node (Leaf [1,2,4,9]) (Leaf [0,3,5,5,8,5])) (Leaf [2,7,5,5,2]) "Done" ```