Учитывая следующий тип данных:
data Tree a =
Branch (Tree a) (Tree a)
| Leaf a deriving (Eq, Show)
И следующий экземпляр Functor:
instance Functor Tree where
fmap f (Leaf a) = Leaf $ f a
fmap f (Branch t1 t2) = Branch (fmap f t1) (fmap f t2)
Как лучше всего реализовать экземпляр Applicative для этого дерева? Я придумал:
instance Applicative Tree where
pure = Leaf
Leaf f <*> t = f <$> t
Branch t1 t2 <*> Leaf a = t1 <*> Leaf a
Branch t1 t2 <*> Branch t3 t4 = Branch (t1 <*> t3) (t2 <*> t4)
Даже если он скомпилируется, я очень подозрительно отношусь к этой реализации. Я не знаю, должен ли этот Branch (Leaf (+1)) (Leaf (+2)) <*> Leaf 7
возвращать Leaf 8
(найти ближайшую функцию для применения) или дублировать и возвращать Branch (Leaf 8) (Leaf 9)
.