module Lab09 where {- EXERCISES -} data BinTree a = Leaf a | Node (BinTree a) (BinTree a) tree = Node (Node (Leaf 'a') (Node (Leaf 'b') (Leaf 'c'))) (Leaf 'd') instance (Show a) => Show (BinTree a) where show (Leaf a) = "" show (Node l r) = "" ++ show l ++ show r ++ "" -- >>> tree -- treeDepth :: BinTree a -> Int treeDepth (Leaf _) = 1 treeDepth (Node l r) = 1 + max (treeDepth l) (treeDepth r) -- >>> treeDepth tree -- 4 labelTree :: BinTree a -> BinTree (a, Int) labelTree t = fst (go 0 t) where go :: Int -> BinTree a -> (BinTree (a, Int), Int) go n (Leaf a) = (Leaf (a, n), n + 1) go n (Node l r) = let (newLeft, n') = go n l (newRight, n'') = go n' r in (Node newLeft newRight, n'') -- >>> labelTree tree -- {- TASKS -} type Monomial a = (a, Int) data Polynomial a = Null | Pol (Monomial a) (Polynomial a) format :: (Show a, Ord a, Num a) => Monomial a -> String format (a, deg) = let coeff | a < 0 = "(" ++ show a ++ ")" | otherwise = show a in if deg == 0 then coeff else coeff ++ "*x^" ++ show deg instance (Show a, Ord a, Num a) => Show (Polynomial a) where show Null = "0" show (Pol m Null) = format m show (Pol m p) = format m ++ " + " ++ show p pol = Pol (-1, 0) (Pol (-2, 1) (Pol (1, 3) Null)) -- >>> pol -- (-1) + (-2)*x^1 + 1*x^3 getDegree :: Polynomial a -> Int getDegree Null = -1 getDegree (Pol (_, deg) p) = max deg (getDegree p) -- >>> getDegree pol -- 3