Экземпляр Applicative
для Either
определяется как:
instance Applicative (Either e) where ...
, учитывая тип (<*>)
, равен Applicative f => f (a -> b) -> f a -> f b
для Either
, то есть:
Either e (a -> b) -> Either e a -> Either e b
Тип Left
равен e -> Either e a
, поэтому тип Left (+3)
равен
Num a => Either (a -> a) b
и тип Left 3
:
Num a => Either a b
, который приводит к типу Left (+3) <*> Left 3
как (Num a, Num (a -> a)) => Either (a -> a) b
, что вряд ли будет тем, что вы намеревались.
Поскольку это тип b
, который содержит функцию и значение для работы, использование конструктора Right
действительно работает:
Right (+3) <*> Right 3
=> Right 6