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
、主にHaskell 98に戻ったデザイナーへのさまざまな圧力のために、2015年までFunctor
のスーパークラスではありませんでした。まだ言語標準です。)Monad
Applicative
Monad
事実上、何Alternative
をするかです。Applicative
MonadPlus
Monad
これらのために私達は得るだろう
empty <*> m = empty
私たちが持っているものと同様に、MonadPlus
同様の分配法則とキャッチ法則が存在し、少なくとも1つは満たす必要があります。
残念ながら、empty <*> m = empty
法律でさえ主張が強すぎます。たとえば、 Backwardsには当てはまりません。
MonadPlusを見ると、空の>> =f=空の法則がほぼ強制されています。空の構造には、とにかく関数を呼び出すための「a」を含めることはできませf
ん。
ただし、はのスーパークラスではApplicative
なく、のスーパークラスでもないため、両方のインスタンスを別々に定義することになります。Monad
Alternative
MonadPlus
さらに、Applicative
のスーパークラスであったとしても、私たちが従ったとしても、とにかくクラスMonad
が必要になるでしょう。MonadPlus
empty <*> m = empty
それはそれを証明するのに厳密には十分ではありません
empty >>= f = empty
したがって、何かがであると主張することは、MonadPlus
それがであると主張することよりも強力ですAlternative
。
さて、慣例により、与えられたタイプのMonadPlus
とAlternative
は一致するはずですが、Monoid
は完全に異なる場合があります。
たとえばMonadPlus
、andforは明らかなことAlternative
を行います。Maybe
instance MonadPlus Maybe where
mzero = Nothing
mplus (Just a) _ = Just a
mplus _ mb = mb
しかし、Monoid
インスタンスは半群をに持ち上げますMonoid
。Semigroup
悲しいことに、Haskell 98には当時クラスが存在していなかったためMonoid
、そのユニットを使用せずに、を要求することで存在します。ಠ_ಠ</p>
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
は完全に異なるものである可能性があります(場合によってはそうである場合もあります)。