Делает он имеет в виду, Строка типа данных и Интервал являются моноидом.
Никакой , ни String
, ни Int
моноиды. Моноид является с 3 кортежами (S, ⊕ e) , где ⊕ бинарный оператор ⊕: S× S → S, такой это для всех элементов a, b, c∈ S это содержит это (a⊕ b) ⊕ c=a⊕ (b⊕ c) , и e∈ S является "нейтральным элементом", таким образом что a⊕ e=e⊕ a=a. String
и Int
типы, так в основном множества значений, но не 3 кортежа.
в статье говорится:
Позволяют нам взять
String
конкатенация иInt
дополнение как пример моноиды , которые имеют отношения.
, Таким образом, автор ясно также упоминает бинарных операторов ((++)
в случае String
, и (+)
в случае Int
). Идентификационные данные (пустая строка в случае [1 110] и 0
в случае [1 112]) оставляют неявными; при отъезде идентификационных данных, поскольку осуществление для читателя распространено в неофициальном английском дискурсе.
Теперь, учитывая, что у нас есть две структуры моноида (M, ⊕ e m) и (N, ⊗ en) , функция f: M → N (как [1 113]) затем называют , гомоморфизм моноида [Wiki] , учитывая его содержит тот f (m1⊕ m2) =f (m1) ⊗ f (m2) для всех элементов m1, m2∈ M и что отображение также сохраняет нейтральный элемент: f (e m) =en.
, Например length :: String -> Int
гомоморфизм моноида, так как мы можем рассмотреть моноиды (String
, (++)
, ""
) и (Int
, (+)
, 0
) . Это содержит это:
length (s1 ++ s2) == length s1 + length s2
(для всего String
s s1
и s2
); и length "" == 0
. В разговорной речи гомоморфизм является функцией, которая сохраняет структуру. В примере эти length
функционируют, сохраненная структура является суммой длин к строкам, являющимся равным продолжительности конкатенации тех же строк. И начиная со строки и начиная с целые числа могут рассматриваться как моноиды (при оборудовании идентификационными данными и ассоциативная бинарная операция, подчиняющаяся законам о моноиде) length
, назван гомоморфизмом моноида.
См. также другие ответы для более технического объяснения.
Тип данных не может быть моноидом самостоятельно. Для моноида Вам нужен тип данных T
и еще две вещи:
|+|
, который берет два элемента типа T
и производит элемент типа T
T
, давайте назовем его i
, таким, что для каждого элемента t
из типа T
следующее содержит: t |+| i = i |+| t = t
Вот некоторые примеры моноида:
гомоморфизм Моноида
моноид Конкатенации строк может быть преобразован в целочисленный дополнительный моноид путем применения .length
ко всем его элементам. Оба тех набора формируют моноид. Между прочим, помните, что мы не можем только сказать, что "набор целых чисел формирует моноид"; мы должны выбрать ассоциативную операцию и соответствующий нейтральный элемент. Если мы берем, например, подразделение в качестве операции, мы нарушаем первое правило (вместо того, чтобы произвести элемент целого числа типа, мы могли бы произвести элемент типа, плавающего/двойного).
Метод length
позволяет нам идти от моноида (конкатенация строк) к другому моноиду (целочисленное дополнение). Если такая операция также сохраняет структуру моноида, это считается гомоморфизм моноида .
Сохранение средств структуры:
length(t1 |+| t2) = length(t1) |+| length(t2)
and
length(i) = i'
то, где t1
и t2
представляют элементы "исходного" моноида, i
, является идентификационными данными "исходного" моноида, и i'
идентификационные данные "целевого" моноида. Можно попробовать его сами и видеть, что length
действительно сохраняющая структуру операция на моноиде конкатенации строк, в то время как, например, indexOf("a")
не.
изоморфизм Моноида
, Как продемонстрировано, length
карты все строки к их соответствующим целым числам и формам моноид с дополнением как операция и нуль как идентификационные данные. Но мы не можем возвратиться - для каждой строки, мы можем выяснить ее длину, но, учитывая длину мы не можем восстановить "исходную" строку. Если мы могли, то операция "продвижения", объединенного с операцией "возвращения", сформируется изоморфизм моноида .
Изоморфизм означает способность пойти назад и вперед без любой потери информации. Например, столь же установленный ранее, список формирует моноид при добавлении как операция и пустой список как нейтральный элемент. Мы могли пойти из "списка при добавлении" моноида к "вектору при добавлении" моноида и назад без любой потери информации, что означает, что операции .toVector
и .toList
вместе формируют изоморфизм. Другой пример изоморфизма, который Runar, упомянутый в его тексте, String
вџ · List[Char]
.