モナド変換子では、
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)
e0
GHC が と一致しないのはなぜe
ですか?回答(コメントで提供):オンにする
ScopedTypeVariables
for
mplus
はundefined
の逆関数に置き換える必要がrunExc
ありますが、拡張効果の API で見つけることができません。私は何か見落としてますか ?
理由a <|> b
:内で書けるようにしたいMember (Exc e) r => Eff r a
、つまり:
- 試す
a
a
スローする場合はea
、試してくださいb
b
スローする場合はeb
、スローしますmappend ea eb
これにはインスタンスが必要です。そのため、最初にインスタンスAlternative
を実装しようとしています。MonadPlus
注: GHC 7.8.3 を使用しています。
よろしくお願いいたします。