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 _ _ _ = []

Respuestas a la pregunta(1)

Su respuesta a la pregunta