In meiner Freizeit lerne ich gerade Haskell, daher ist dies eine Anfängerfrage.
In meiner Lektüre bin ich auf ein Beispiel gestoßen, das zeigt, wie Either a
wird zu einer Instanz von Functor
:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Nun versuche ich zu verstehen, warum die Implementierungskarten im Falle einer Right
Wert-Konstruktor, aber nicht im Fall eines Left
?
Hier ist mein Verständnis:
Lassen Sie mich zunächst den obigen Fall wie folgt umschreiben
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
Jetzt:
-
Ich weiß, dass
fmap :: (c -> d) -> f c -> f d
-
wenn wir ersetzen
f
conEither a
erhalten wirfmap :: (c -> d) -> Either a c -> Either a d
-
die Art der
Right (g x)
estEither a (g x)
und die Art derg x
estd
so haben wir, dass der Typ vonRight (g x)
estEither a d
was wir erwarten vonfmap
(siehe 2. oben) -
Nun, wenn wir uns die
Left (g x)
können wir mit der gleichen Argumentation sagen, dass sein TypEither (g x) b
d.h.Either d b
was nicht das ist, was wir vonfmap
(siehe 2. oben): died
sollte der zweite Parameter sein, nicht der erste! Wir können also nicht überLeft
.
Ist meine Argumentation richtig?