Подтвердить что ты не робот

Моноид против MonadPlus

Я очень новичок как в Monads, так и в Monoids, а недавно узнал о MonadPlus. Из того, что я вижу, Monoid и MonadPlus предоставляют тип с ассоциативной двоичной операцией и идентификатором. (Я бы назвал эту полугруппу математическим языком.) В чем же разница между Monoid и MonadPlus?

4b9b3361

Ответ 1

A semigroup - это структура, снабженная ассоциативной двоичной операцией. A monoid - полугруппа с элементом идентификации для двоичной операции.

Монады и полугруппы

Каждая монада должна придерживаться законов монады. Для нашего случая важным является закон ассоциативности. Выражается с помощью >>=:

(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, чтобы он не отображался в m, n или p).

Если мы специализируем >> на тип m a -> m a -> m a (подставляя b для a), мы видим, что для любого типа a операция >> образует полугруппу на m a. Так как это верно для любого a, мы получаем класс полугрупп, проиндексированных знаком a. Однако они не являются моноидами вообще - у нас нет элемента идентификации для >>.

MonadPlus и моноиды

MonadPlus добавляет еще две операции mplus и mzero. MonadPlus законов явно указать, что mplus и mzero должны образовывать моноид на m a для произвольного a. Итак, мы снова получаем класс моноидов, индексированный a.

Обратите внимание, что разница между MonadPlus и Monoid: Monoid говорит о том, что некоторый единственный тип удовлетворяет моноидальным правилам, а MonadPlus говорит, что для всех возможных a тип m a удовлетворяет моноидальным законам. Это гораздо более сильное условие.

Итак, экземпляр MonadPlus образует две различные алгебраические структуры: класс полугрупп с >> и класс моноидов с mplus и mzero. (Это не является чем-то необычным, например, множество натуральных чисел больше нуля {1,2,...} образует полугруппу с + и моноид с × и 1.)

Ответ 2

Если у нас есть MonadPlus m, то вы скажете, что m - это Monad, но m a (тип, полученный в результате применения a к типу "функция" m), является моноидом.

Если мы определим (аналогично определению 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)

Мы можем даже определить Haskell Monoid, если мы используем -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 from Control.Applicative.

Ответ 3

Я должен подчеркнуть очень важное различие: в отличие от Monoid, и в отличие от других ответов, MonadPlus не предоставляет тип с ассоциированной двоичной операцией и идентификатором. Haskell Report, единственный документ, который может претендовать на статус Стандарта, не определяет законы MonadPlus и, следовательно, не требует, чтобы mplus был ассоциативным или mzero чтобы быть его левой или правой единицей. Возможно, авторы все еще обсуждали законы: есть очень веские причины, чтобы mplus не был ассоциативным. Например, если mplus является ассоциативным, но некоммутативным, то недетерминированное вычисление поиска, представленное MonadPlus, не может быть полным (то есть существуют решения, которые мы не можем найти). Так как довольно редко mplus является коммутативным, любая полная недетерминированная процедура поиска не может быть представлена ​​MonadPlus, если мы настаиваем на ассоциативности. Было детальное обсуждение этой самой проблемы законов MonadPlus о SC: Должно быть mplus всегда быть ассоциативным