zip с деревьями в Хаскеле

Я изучаю Haskell, используя Школу выражений Haskell: изучение функционального программирования с помощью мультимедиа, и я не уверен, как решить эту задачу.

Используя определение деревьев, данное

data Tree a = Node (Tree a) (Tree a) | Leaf a

Определить древовидные версии списка функцийzip а такжеzipWith, Будут случаи на листьях или где деревья имеют различные формы, где вам придется принимать дизайнерские решения. Постарайтесь сделать свои решения максимально элегантными.

Заzip У меня есть это, но я не уверен, что это "элегантно"

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

И я не уверен, как адаптировать его, чтобы иметьzipWith функциональность, хотя я знаю элегантное определение zipWith.

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
zipWith _ _ _ = []

Ответы на вопрос(1)

Ваш ответ на вопрос