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