Гомоморфизм и изоморфизм моноидов

Читаю книгу "Программирование на 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.
Другие вопросы по тегам