Как применить аппликатив к RoseTree, т.е. вернуть дерево, состоящее из деревьев, созданных последовательным применением функций к начальным узлам. Вот код, который я написал:
{-# LANGUAGE DeriveFunctor, InstanceSigs #-}
data RoseTree a = Nil | Node a [RoseTree a] deriving(Functor,Show)
instance Applicative RoseTree where
pure :: a -> RoseTree a
pure x = Node x []
(<*>) :: RoseTree (a -> b) -> RoseTree a -> RoseTree b
(<*>) _ Nil = Nil
(<*>) Nil _ = Nil
(<*>) (Node f tree) (Node x subtrees) = Node (f x) (zipWith (<*>) tree subtrees)
Я не уверен, что не так с моим определением чистого и (‹*>). Вот ошибка, которую я получил:
Ошибка: failure in expression `(Node (+1) []) <*> (Node 7 [Node 1 [], Node 2 [], Node 3 [Node 4 []]])'
expected: Node 8 [Node 2 [],Node 3 [],Node 4 [Node 5 []]]
but got: Node 8 []
Тестовые случаи для справки:
-- >>> (Node (+1) [Node (*2) []]) <*> Nil
-- Nil
--
-- >>> Nil <*> (Node 7 [Node 1 [], Node 2 [], Node 3 [Node 4 []]])
-- Nil
--
-- >>> (Node (+1) []) <*> (Node 7 [Node 1 [], Node 2 [], Node 3 [Node 4 []]])
-- Node 8 [Node 2 [],Node 3 [],Node 4 [Node 5 []]]
--
-- >>> (Node (+1) [Node (*2) []]) <*> (Node 5 [Node 2 [], Node 8 [Node 1 []]])
-- Node 6 [Node 3 [],Node 9 [Node 2 []],Node 10 [Node 4 [],Node 16 [Node 2 []]]]