Daniels ausgezeichnete Antwort hinzuzufügen, gibt es ein paar Punkte, die ich würde gerne machen:
Zuerst here's die Applicative Beispiel:
instance Applicative (Either e) where
pure = Right
Left e <*> _ = Left e
Right f <*> r = fmap f r
Sie können sehen, dass dies ‚kurz- circuiting '- sobald es eine Left
trifft, bricht es ab und gibt diese Linke zurück. Sie können dies mit der Strenge-Analyse des armen Mannes überprüfen:
Zweitens ist Ihr Beispiel ein wenig schwierig. Im Allgemeinen sind der Typ der Funktion und die e
in Either e
nicht verwandt. Hier ist <*>
s Typ:
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Wenn wir die Substitution f
machen - >>Either e
, erhalten wir:
(<*>) :: Either e (a -> b) -> Either e a -> Either e b
Obwohl in Ihrem Beispiel e
und a
Spiel, in der Regel werden sie nicht Dies bedeutet, dass Sie eine Applicative-Instanz für Either e
nicht polymorph implementieren können, die die Funktion auf ein linkes Argument anwendet.
Es ist eine traditionelle Verwendung von entweder, dass Right einen Wert darstellt, der Sie interessiert, während Left einen Fehler darstellt. Richtige (korrekte) Werte können mit Applicative und Functor kombiniert und modifiziert werden, während ein Wert für Links über schlecht hartnäckig beibehalten wird, also ist es gut für Dinge wie das Melden des ersten Fehlers, wie ein einfacher Compiler. – AndrewC