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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage