В свободное время я изучаю 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
(см. выше) -
теперь, если мы посмотрим на
Left (g x)
, мы можем использовать те же рассуждения, что сказать, что его типEither (g x) b
, то естьEither d b
, чего мы не ожидаем отfmap
(см. 2 выше):d
должен быть вторым параметром, а не первым! Таким образом, мы не можем сопоставлятьLeft
.
Правильны ли мои рассуждения?