Pendant mon temps libre j'apprends Haskell, c'est donc une question débutant.Comprendre comment Either est une instance de Functor
Dans mes lectures, je suis tombé sur un exemple illustrant comment Either a
est fait une instance de Functor
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Maintenant, je suis en train de comprendre pourquoi les cartes de mise en œuvre dans le cas d'un constructeur de valeur Right
, mais ne pas dans le cas d'un Left
?
Voici ma compréhension:
Tout d'abord permettez-moi de réécrire l'exemple ci-dessus comme
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
maintenant:
Je sais que
fmap :: (c -> d) -> f c -> f d
si nous substituer
f
avecEither a
nous obtenonsfmap :: (c -> d) -> Either a c -> Either a d
le type de
Right (g x)
estEither a (g x)
, et le type deg x
estd
, nous avons donc que le type deRight (g x)
estEither a d
, qui est ce que nous attendons defmap
(voir 2 ci-dessus)maintenant, si nous regardons
Left (g x)
nous pouvons utiliser le même raisonnement pour dire que son type estEither (g x) b
, qui estEither d b
, ce qui est pas ce que nous attendons defmap
(voir 2 ci-dessus): led
devrait être le second paramètre pas le premier! Donc, nous ne pouvons pas cartographierLeft
.
Mon raisonnement est-il correct?
Ou est peut-être plus évidemment bifoncteur qu'un Functor - un bifoncteur a une bimap opération - bimap :: (a -> m) -> (b -> n) -> fab -> fm n. Cela vous donne un mappage sur les deux cas de gauche et de droite. La bibliothèque standard de Haskell n'a pas de classe Bifunctor, c'est parce qu'il y a beaucoup moins de Bifoncteurs que de Functors "dans la nature" bien que ce soit pratique pour Either et pair (a, b). –
En 3, vous utilisez (g x) en tant que partie d'un type, mais c'est une valeur. Il semble que vous vouliez écrire le 'typeof (g x)' là, et non '(g x)' lui-même. – Peaker
@stephen tetley: c'est intéressant! Merci – MarcoS