В свободное время я изучаю Haskell, так что это вопрос для начинающих.
В своих чтениях я наткнулся на пример, иллюстрирующий, как Either a
становится экземпляром Functor
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Теперь я пытаюсь понять, почему реализация отображается в случае конструктора значений Right
, но не в случае Left
?
Вот мое понимание:
Сначала позвольте мне переписать приведенный выше пример как
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
Сейчас:
Я знаю, что
fmap :: (c -> d) -> f c -> f d
если мы заменим
f
наEither a
, мы получимfmap :: (c -> d) -> Either a c -> Either a d
тип
Right (g x)
— этоEither a (g x)
, а типg x
— этоd
, поэтому мы имеем, что типRight (g x)
— этоEither a d
, чего мы и ожидаем отfmap
(см. 2. выше)теперь, если мы посмотрим на
Left (g x)
, мы можем использовать те же рассуждения, чтобы сказать, что его типEither (g x) b
, то естьEither d b
, чего мы не ожидаем отfmap
(см. 2. выше):d
должно быть вторым параметром, а не первый! Поэтому мы не можем нанести на картуLeft
.
Верны ли мои рассуждения?
typeof (g x)
, а не(g x)
. - person Peaker   schedule 06.03.2011