Gibt es einen Standardnamen oder eine Implementierung des "rein anwendbaren Entweder"?
Ich finde häufig Verwendung für das, was ich als "rein anwendend" bezeichneEither
", d.h.Either
mit demApplicative
Instanz verfügbar, solange wir keine implementierenMonad
Instanz auch.
newtype AEither e a = AEither { unAEither :: Either e a }
deriving Functor
-- technically we only need Semigroup
instance Monoid e => Applicative (AEither e) where
pure a = AEither (pure a)
AEither e1 <*> AEither e2 = AEither (combine e1 e2) where
combine (Right f) (Right a) = Right (f a)
combine (Left m1) (Left m2) = Left (m1 <> m2)
combine (Left m ) _ = Left m
combine _ (Left m ) = Left m
Es ist wirklich nützlichApplicative
da es einen mächtigeren Begriff der "Zusammenfassung von Fehlern" liefert alsEither
'sMonad
Instanz tun kann. Zu diesem Zweck setze ich es immer wieder um.
Gibt es irgendwo eine Standardinstanz? Gibt es überhaupt einen Standardnamen?