私は「純粋に応用的」と私が呼んでいるものEither
、つまりEither
、Applicative
インスタンスを実装しない限りインスタンスが利用可能であるという用途を頻繁に見つけますMonad
。
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
のインスタンスApplicative
よりも強力な「エラーの要約」の概念を提供するため、非常に便利です。そのために、何度も何度も実装しています。Either
Monad
どこかに標準インスタンスはありますか?標準的な名前もありますか?