zipWith para árvores em Haskell
Estou aprendendo Haskell usando a Escola de Expressão Haskell: aprendendo programação funcional por meio de multimídia e não tenho certeza de como resolver esse exercício.
Usando a definição de árvores dada por
data Tree a = Node (Tree a) (Tree a) | Leaf a
Definir versões em árvore das funções da listazip
ezipWith
. Haverá casos nas folhas ou em que as árvores terão formas diferentes em que você terá que tomar decisões de design. Tente tomar suas decisões o mais elegante possível.
Parazip
Eu tenho isso, mas não tenho certeza se é "elegante"
zipTree :: Tree a -> Tree b -> Tree (a,b)
zipTree (Leaf a) (Leaf b) = Leaf (a,b)
zipTree (Node l1 r1) (Node l2 r2) =
let l = zipTree l1 l2
r = zipTree r1 r2
in Node l r
-- Problems...
zipTree (Node _ _) (Leaf _) = Node undefined undefined
zipTree (Leaf _) (Node _ _) = Node undefined undefined
E não tenho certeza de como adaptá-lo para terzipWith
funcionalidade, embora eu conheça uma definição elegante de zipWith.
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
zipWith _ _ _ = []