(Этот ответ украл его определения из https://stackoverflow.com/a/3870310/200266 и только пытается чтобы дать приблизительное объяснение. Мои познания в теории категорий довольно базовые.)
В общем случае утверждение, что монада также является моноидом, справедливо только в том случае, если вы рассматриваете функтор (например, T => Option[T]
), а не значения (например, Some(3)
или None
).
В качестве примера моноида над значениями давайте посмотрим на List[T]
.
У нас есть бинарная операция • : S × S -> S:
def append[T](list1: List[T], list2: List[T]): List[T] = list1 append list2
и пустой список Nil
, очевидно, является элементом идентификации. Однако в каждой монаде нет метода append
, поэтому приведенное выше нельзя обобщить на все монады. Давайте немного изменим определение бинарной операции.
Теперь в приведенном выше случае × можно рассматривать как возвращающий кортеж входных значений:
List[T] × List[T] => (List[T], List[T])
И наша функция append
получает на вход этот кортеж.
Однако мы можем изменить операцию кортежа × на ∘, что теперь означает композицию функторов.
(K => List[K]) ∘ (K => List[K]) => (K => List[List[K]])
Итак, мы ищем функцию, выполняющую μ : T ∘ T -> T или более конкретную
(K => List[List[K]]) => (K => List[K])
Эта операция известна в Scala как flatten
(join
в Haskell). Элемент идентификации моноида — это конструктор монады, который не имеет общего имени в Scala (return
в Haskell), но существует для каждой монады. Например. x => List(x)
.
Подводя итог, учитывая этот и другие ответы на этот вопрос, есть три возможности того, как монада может быть моноидом:
A) Каждая монада также является моноидом в указанном выше смысле при функторной композиции.
Б) Каждая монада M[T]
имеет моноид, если также существует моноид (с некоторой бинарной операцией ~+~
) для T: for {x <- ma; y <- mb} yield x ~+~ y
C) Некоторые монады могут иметь один или несколько специфических моноидов, которые отличаются от моноидов в B. Например, добавление List
или orElse
Option
.
person
Debilski
schedule
17.02.2014
ma
иmb
? НапримерOption(1)
иOption(2)
? - person senia   schedule 17.02.2014append
не является бинарной ассоциативной операцией? Что такоеSome(z)
добавить {Some(x)
добавитьSome(y)
}? Это то же самое, если вы измените порядок? - person S.R.I   schedule 17.02.2014Some(1) * Some(2)
. Что здесь*
? - person Michael   schedule 17.02.2014*
==join
/flatten
; 1 ==return
.) - person Debilski   schedule 17.02.2014