В свободное время я изучаю 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.
Правильны ли мои рассуждения?