MonadPlus
Monoid
さまざまな目的を果たします。
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
のスーパーではなかったMonad
2015年は、今、私たちは最終的に持っているまで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
ように見える、正確に同じ(モジュロスーパー制約)。