Haskellのエラーモナドの反対のモナドは何ですか


9

エラーモナドでは、最初の失敗は実行を停止し、後続のバインドを介して障害を運ぶだけです。

どのモナドが成功を止めるのは、成功のみを先送りし、基本的には障害を飲み込み、前の失敗を無視して次のバインドを試みますか?

エラーモナドは、成功のようなこの失敗の処理に使用できますが、デフォルトのライブラリにこの特定の目的のためのモナドがあるかどうか、私の心のOrモナドのように、「これか、それか」に興味があります。

編集:

動作は次のようになります:

Left "fail" >>= (\x -> Right "win") >>= (\x -> Left "ahh neener") >>= (\x -> Right (x + " yay"))

エラーモナドでは、最初の左の値がそのまま繰り越されるため、その結果はになりLeft "fail"ます。私が望む動作は、上記が返すところですRight "win yay"私が自分で書くことができる実装するのは簡単なモナドですが、そのようなことをするために存在するものを考えました(Eitherを使用していないかもしれませんが、そのような動作について最初に頭に浮かぶのはそれです)。


なぜ反対票か。この質問について何か悪いことはありますか?
ジミーHoffa

あなたの考えを示す小さなコードスニペットを提供できますか?
Daniel Gratzer

バックトラックを考えているのでしょうか?
スカー冷蔵庫2013年

回答:


4

必要なのはMonadPlusですHaskell wikiも参照)。それは定義します

mzero :: m a

不特定のエラーを表す

mplus :: m a -> m a -> m a

最初の計算が失敗した場合、2番目の計算を試みます。いくつかの補助機能も提供されています。

-- Extends `mplus` to lists of computations:
msum :: MonadPlus m => [m a] -> m a
-- Fails a computation conditionally.
guard :: MonadPlus m => Bool -> m ()
-- Filter (fail) computations that don't satisfy the predicate.
mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a

のインスタンスは、次のMonadPlus2つのカテゴリに分類できます。

  1. mplus両方の引数から考えられるすべての結果を組み合わせます(左分布法を満たします)。[]そしてSeqおそらくこの動作をする唯一のインスタンスです。
  2. mplus有効な値が含まれている場合は、左の引数を選択します。それ以外の場合は、右の引数を選択します(左キャッチ法則を満たします)。この動作を持つインスタンスがありMaybeEitherSTMIO

(のMonadPlusインスタンスはEither、Control.Monad.Errorで次のように定義されていました

instance (Error e) => MonadPlus (Either e) where
    mzero            = Left noMsg
    Left _ `mplus` n = n
    m      `mplus` _ = m

しかし、何らかの理由で現在のバージョンでは不足しているようです。)

参照してください。ウィキブックスにMonadPlusのをし、HaskellのIOのためMonadPlusの定義


おかげで、モナドプラスのリストのように聞こえました。
ジミーホファ

@JimmyHoffaものSeqインスタンスであることを忘れていましたMonadPlus。の[]連結(mplusSeqO(log n)であるのに対して、リストの連結はO(n)であるため、私はそれを強くお勧めします。
PetrPudlák2013年

haskell wikiは非常に明るいです。haskellコミュニティは、私がどのように機能させたいかについて私が考えているのと同じように、どの方向に進むべきかについて考えているようです。Orを「This or that」またはthen「This then that」にしたい場合、最初に失敗するとOrのような動作が発生しますが、Orは次のものに事前障害値を使用しています次のものはOrとは異なり、最初の関数から返された値を使用します。
ジミー・ホッファ

はい、私はモナドプラスの改革案を支持します。これにより多くのことが明確になると思います。
PetrPudlák2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.