Гомоморфизм и изоморфизм моноидов
Читаю книгу "Программирование на Scala" (Красная книга).
В главе о моноидах я понимаю, что такое гомоморфизм моноидов, например: струнный моноид M
с конкатенацией и length
функция f
сохраняет структуру моноида и, следовательно, гомоморфны.
M.op(f(x), f(y)) == M.op(f(x) + f(y))
// "Lorem".length + "ipsum".length == ("Lorem" + "ipsum").length
Цитата из книги (По памяти, поправьте меня, если я ошибаюсь:
Когда это происходит в обоих направлениях, это называется Monoid isomorphisim, что означает, что для моноидов
M, N
, и функцииf, g
,f andThen g
а такжеg andThen f
являютсяidentity
функция. Например,String
Моноид иList[Char]
Моноиды с конкатенацией изоморфны.
Но я не вижу реального примера, чтобы увидеть это, я могу только думать о f
как length
функция, но что происходит с g
?
Примечание. Я видел этот вопрос: что такое изоморфизм и гомоморфизм.
2 ответа
Чтобы увидеть изоморфизм между String
а также List[Char]
у нас есть toList: String -> List[Char]
а также mkString: List[Char] -> String
.
length
является гомоморфизмом моноида String в моноид натуральных чисел с добавлением.
Вот несколько примеров эндогомоморфизма моноида String. toUpperCase
а также toLowerCase
.
Для списков у нас есть много гомоморфизмов, многие из которых являются просто версиями fold
.
Вот ответ siyopao, выраженный в программе ScalaCheck
object IsomorphismSpecification extends Properties("f and g") {
val f: String => List[Char] = _.toList
val g: List[Char] => String = _.mkString
property("isomorphism") = forAll { (a: String, b: List[Char]) =>
(f andThen g)(a) == a && (g andThen f)(b) == b
}
}
который выводит
+ f and g.isomorphism: OK, passed 100 tests.