Поскольку fmap
отображает значение, определенное в Right
, а не в Left
. Действительно, Either
определяется как:
data Either a b = Left a | Right b
, и Functor
из Either a
, таким образом, реализуется как:
instance Functor (Either a) where
fmap _ (Left x) = Left x
fmap f (Right x) = Right (f x)
Это имеет смысл, поскольку Functor
ожидает тип вида * -> *
, и, таким образом, fmap :: Functor f => (b -> c) -> f b -> f c
создает отображение для Either
с fmap :: (b -> c) -> Either a b -> Either a c
.
Поскольку void
определяется как void = fmap (const ())
, это означает, что если мы сделав анализ по каждому случаю, мы увидим:
fmap (const ()) (Left x) = Left x
fmap (const ()) (Right x) = Right (const () x) = Right ()