24

私は両方に非常に慣れていないMonadsMonoidsについて最近知りましたMonadPlus。私が見たところ、MonoidどちらMonadPlusも連想二項演算とアイデンティティを備えた型を提供しています。(私はこれを数学用語で半群と呼びます。) では、 と の違いは何MonoidですかMonadPlus?

4

3 に答える 3

34

半群とは、連想二項演算を備えた構造体です。モノイドは、二項演算の恒等元を持つ半群です。

モナドと半群

すべてのモナドはモナドの法則に従う必要があります。私たちの場合、重要なのは結合法則です。を使用して表現>>=:

(m >>= f) >>= g     ≡   m >>= (\x -> f x >>= g)

この法則を適用して の結合性を導き出しましょう>> :: m a -> m b -> m b:

(m >> n) >> p       ≡ (m >>= \_ -> n) >>= \_ -> p
                    ≡ m >>= (\x -> (\_ -> n) x >>= \_ -> p)
                    ≡ m >>= (\x -> n >>= \_ -> p)
                    ≡ m >>= (\x -> n >> p)
                    ≡ m >> (n >> p)

( 、またはxに表示されないように選択した場所)。mnp

>>型に特化するとm a -> m a -> m a( を代入bしてa)、任意の型aに対して操作>>が 上の半群を形成することがわかりますm aこれは任意の に当てはまるため、aによってインデックス付けされた半群のクラスを取得しますa。ただし、それらは一般にモノイドではありません - の恒等要素はありません>>

MonadPlus とモノイド

MonadPlusさらに 2 つの操作を追加mplusmzeroます。MonadPlus法則は明示的に述べてmplusおり、任意の に対してmzeroモノイドを形成しなければなりません。再び、 によってインデックス付けされたモノイドのクラスを取得します。m aaa

と の違いに注意してくださいMonadPlus:MonoidMonoid、ある単一の型がモノイド規則を満たしてMonadPlusいることを示していますが、可能なすべてaの型について、その型がモノイド規則を満たしていることを示していm aます。これははるかに強い条件です。

したがって、MonadPlusインスタンスは 2 つの異なる代数構造を形成します。半群のクラスとと>>のモノイドのクラスです。(これは珍しいことではありません。たとえば、ゼロより大きい自然数の集合は、とで半群を形成し、と でモノイドを形成します。)mplusmzero{1,2,...}+×1

于 2013-06-12T08:58:13.777 に答える
12

それが成立する場合、は aであるMonadPlus mと言えますが、(型 "関数" に適用した結果の型) はモノイドです。mMonadm aam

を定義すると ( の定義に似てData.Monoidいますが、後でこれを利用します)

class                Semigroup a where  (<>) :: a -> a -> a
class Semigroup a => Monoid    a where  zero :: a

それからそれは持っています

mzero :: MonadPlus m => m a
mplus :: MonadPlus m => m a -> m a -> m a

かなり類似した型と適切な法則

-- left and right identity
mplus a     mzero   ==   a
mplus mzero a       ==   a

-- associativity
(a `mplus` b) `mplus` c   ==   a `mplus` (b `mplus` c)

Monoidを使用すれば、Haskell を定義することもできます-XFlexibleInstances

{-# LANGUAGE FlexibleInstances #-}
instance MonadPlus m => Semigroup (m a) where  (<>) = mplus
instance MonadPlus m => Monoid    (m a) where  zero = mzero

これらは のインスタンスと重なっていますがData.Monoid、これがおそらく標準インスタンスではない理由です。


このようなモノイドの別の例は、Alternative m => m aからのものControl.Applicativeです。

于 2013-06-12T02:52:40.173 に答える
7

非常に重要な違いを強調しなければなりません。モノイドとは異なり、他の回答の状態とは異なり、MonadPlus はそうではありません。関連二項演算と ID を持つ型を提供します。標準のステータスを主張できる唯一のドキュメントである Haskell Report は、MonadPlus の法則を指定していないため、mplus が連想であることや、mzero が左または右の単位であることを要求していません。おそらく、著者たちはまだ法則について議論していたのでしょう: mplus が結合的でないのには十分な理由があります。たとえば、mplus が結合的で可換でない場合、MonadPlus によって表される非決定論的検索計算は完了できません (つまり、見つけられない解が存在します)。mplus が可換であることは非常にまれであるため、結合性を主張する場合、完全な非決定論的検索手順を MonadPlus で表すことはできません。SC に関する MonadPlus の法則のまさにこの問題について、詳細な議論が行われました。mplus は常に関連付けられている必要があります

于 2014-11-14T10:24:39.650 に答える