Я пытаюсь определить экземпляры для Functor
, Applicative
и Monad
для следующих type
:
data BTree a=Leaf a | Node (BTree a) (BTree a) deriving (Eq,Show)
Я попытался реализовать экземпляр Functor
следующим образом:
instance Functor BTree where
fmap f (Leaf t) =Leaf (f t)
fmap f (Node a b) =Node (f a) (f b)
Что сработало
fmap f (Node a b)=Node (fmap f a) (fmap f b)
Я понимаю, что это неправильно, так как, будучи экземпляром functor
, форма должна быть сохранена f a
-> f b
(в нашем случае Node
).и в моей реализации вы получите f a -> b
.
Что я не понимаю:
Почему это бесконечный тип?Учитывая Node (f a )(f b)
где-то в иерархии, дочерний элемент Node
будет Leaf
, и я буду применять f
к нему.