MonadPlusMonoidさまざまな目的を果たします。
AMonoidは、種類のタイプに対してパラメーター化されます*。
class Monoid m where
mempty :: m
mappend :: m -> m -> m
したがって、結合法則であり、単位を持つ明白な演算子が存在するほとんどすべてのタイプに対してインスタンス化できます。
ただし、MonadPlusモノイド構造を持っていることを指定するだけでなく、その構造がMonad動作方法に関連していること、およびその構造がモノイドに含まれる値を気にしないことも指定します。これは、(部分的に)事実によって示されます。それMonadPlusは種類の引数を取ります* -> *。
class Monad m => MonadPlus m where
mzero :: m a
mplus :: m a -> m a -> m a
モノイド法に加えて、適用できる法の2つの潜在的なセットがありますMonadPlus。悲しいことに、コミュニティは彼らがどうあるべきかについて意見が分かれています。
少なくとも私たちは知っています
mzero >>= k = mzero
しかし、他に2つの競合する拡張機能があります。それは、左(原文のまま)の分配法です。
mplus a b >>= k = mplus (a >>= k) (b >>= k)
と左キャッチ法
mplus (return a) b = return a
したがって、のインスタンスはMonadPlus、これらの追加の法則の一方または両方を満たす必要があります。
では、どうAlternativeですか?
Applicative後に定義されたMonad、論理的のスーパークラスとして所属Monadしても、しかし、主にバックハスケル98でデザイナーの異なる圧力へFunctorのスーパーではなかったMonad2015年は、今、私たちは最終的に持っているまでApplicativeのスーパークラスとしてMonad(ない場合はGHCでまだ言語標準です。)
事実上、何AlternativeをするApplicativeかMonadPlusですMonad。
これらのために私達は得るだろう
empty <*> m = empty
私たちが持っているものと同様に、MonadPlus同様の分配法則とキャッチ法則が存在し、少なくとも1つは満たす必要があります。
残念ながら、empty <*> m = empty法律でさえ主張が強すぎます。たとえば、Backwardsには当てはまりません。
MonadPlusを見ると、空の>> = f =空の法則がほぼ強制されています。空のコンストラクションにはf、とにかく関数を呼び出すための「a」を含めることはできません。
しかし、ApplicativeあるではないのスーパークラスMonadとAlternativeされていないのスーパーMonadPlus、我々は別に両方のインスタンスを定義する羽目になる。
さらに、Applicativeのスーパークラスであったとしても、私たちが従ったとしても、とにかくクラスMonadが必要になるでしょう。MonadPlus
empty <*> m = empty
それはそれを証明するのに厳密には十分ではありません
empty >>= f = empty
したがって、何かがであると主張することは、MonadPlusそれがであると主張することよりも強力ですAlternative。
さて、慣例により、MonadPlusおよびAlternative特定のタイプのためには同意する必要がありますが、Monoidかもしれ全く異なります。
例えばMonadPlusとAlternativeのためのMaybe明白なことを実行します。
instance MonadPlus Maybe where
mzero = Nothing
mplus (Just a) _ = Just a
mplus _ mb = mb
しかし、Monoidインスタンスは半群をに持ち上げますMonoid。悲しいことにSemigroup、Haskell 98には当時クラスが存在していなかったため、を要求することによって存在しますがMonoid、そのユニットは使用しません。ಠ_ಠ
instance Monoid a => Monoid (Maybe a) where
mempty = Nothing
mappend (Just a) (Just b) = Just (mappend a b)
mappend Nothing x = x
mappend x Nothing = x
mappend Nothing Nothing = Nothing
TL; DR MonadPlusは、よりも強力な主張でありAlternative、これは、よりも強力な主張Monoidであり、型のインスタンスMonadPlusとAlternativeインスタンスは関連している必要がありますが、Monoidは完全に異なるものである可能性があります(場合によってはそうである場合もあります)。
ApplicativeおよびMonadPlusように見える、正確に同じ(モジュロスーパー制約)。