モナド変換子では、
instance (Monad m, Monoid e) => MonadPlus (ExceptT e m)
拡張可能な効果には、次のようなものはありません
instance (Monoid e) => MonadPlus (Eff (Exc e :> r))
私は無駄にそれを実装しようとしました。これが私がこれまでに持っているものです:
instance (Monoid e) => MonadPlus (Eff (Exc e :> r)) where
mzero = throwExc mempty
a `mplus` b = undefined $ do
resultA <- runExc a
case resultA of
Left l -> runExc b
Right r -> return $ Right r
2 つの問題があります。
の場合
mzero、GHC は次のように文句を言います。Could not deduce (Monoid e0) arising from a use of ‘mempty’ from the context (Monad (Eff (Exc e :> r)), Monoid e)e0GHC が と一致しないのはなぜeですか?回答(コメントで提供):オンにする
ScopedTypeVariablesfor
mplusはundefinedの逆関数に置き換える必要がrunExcありますが、拡張効果の API で見つけることができません。私は何か見落としてますか ?
理由a <|> b:内で書けるようにしたいMember (Exc e) r => Eff r a、つまり:
- 試す
a aスローする場合はea、試してくださいbbスローする場合はeb、スローしますmappend ea eb
これにはインスタンスが必要です。そのため、最初にインスタンスAlternativeを実装しようとしています。MonadPlus
注: GHC 7.8.3 を使用しています。
よろしくお願いいたします。