zipWith para árboles en Haskell
Estoy aprendiendo a Haskell usando la Escuela de Expresión de Haskell: Programación funcional de aprendizaje a través de multimedia y no estoy seguro de cómo resolver este ejercicio.
Usando la definición de árboles dada por
data Tree a = Node (Tree a) (Tree a) | Leaf a
Definir versiones en árbol de las funciones de la lista.zip
yzipWith
. Habrá casos en las hojas o donde los árboles son de diferentes formas donde tendrá que tomar decisiones de diseño. Intenta tomar tus decisiones lo más elegante posible.
porzip
Tengo esto pero no estoy seguro si es "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
Y no estoy seguro de cómo adaptarlo para tenerzipWith
funcionalidad aunque conozco una definición elegante de zipWith.
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
zipWith _ _ _ = []