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

questionAnswers(1)

yourAnswerToTheQuestion