3

モナド変換子では、

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ですか?

    回答(コメントで提供):オンにするScopedTypeVariables

  • formplusundefinedの逆関数に置き換える必要が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 を使用しています。

よろしくお願いいたします。

4

1 に答える 1