Различие между классами типов MonadPlus, Alternative и Monoid?

Классы типов стандартной-библиотеки Haskell MonadPlus, Alternativeи Monoidпредоставляют два метода с практически одинаковой семантикой:

  • Пустое значение:mzero], emptyили mempty.
  • Оператор a -> a -> a, который объединяет значения в классе типов вместе :mplus, <|>или mappend.

Все три определяют эти законы, которым должны подчиняться экземпляры.:

mempty `mappend` x = x
x `mappend` mempty = x

Таким образом, кажется, что все три класса типов предоставляют одни и те же одни и те же методы.

(Alternativeтакже предоставляет someи many, но их определений по умолчанию обычно достаточно, и поэтому они не слишком важны с точки зрения этого вопроса.)

Итак, мой вопрос::почему эти три чрезвычайно похожих класса? Есть ли какая-то реальная разница между ними, помимо их различных ограничений суперкласса?

80
задан Xenon 16 April 2012 в 02:06
поделиться