scalabook

Форк
0
68 строк · 2.7 Кб

Category

Формальное определение

Category

- это Compose
с операцией identity
. Category
можно трансформировать в Monoid и PlusEmpty.

Category

должен удовлетворять следующим законам (помимо законов родительских классов типов):

  • Identity (тождественность): существует e ∈ M
    такое, что e + x = x + e = x

Тождественность

Каждый объект имеет специальную стрелку, называемую тождественной (или тождественностью), которая оставляет объект неизменным. Это означает, что когда вы компонуете тождественную стрелку с любой другой стрелкой, входящей или исходящей, то получаете ту же стрелку. Тождественная стрелка ничего не делает с другой стрелкой.

Тождественная стрелка на объекте a обозначается как \(id_{a}\). Так что, если имеется стрелка \(f : a \to b\), то можно скомпоновать ее с тождественностями с обеих сторон: \(id_{b} \circ f = f = f \circ id_{a}\)

Возьмем элемент \(x : 1 \to a\) и скомпонуем его с \(id_{a}\). Результат \(id_{a} \circ x = x\) означает, что тождественность оставляет элементы неизменными.

Определение в виде кода на Scala

trait Category[=>:[_, _]] extends Compose[=>:]:
def id[A]: A =>: A
def empty: PlusEmpty[[A] =>> A =>: A] = new PlusEmpty[[A] =>> A =>: A] with ComposePlus:
def empty[A]: A =>: A = id
def monoid[A]: Monoid[A =>: A] = new Monoid[A =>: A] with ComposeSemigroup[A]:
def empty: A =>: A = id

Примеры

Функция от одной переменной

given Category[Function1] with
override def compose[A, B, C](f: B => C, g: A => B): A => C = g andThen f
override def id[A]: A => A = a => a

Реализация

Реализация в ScalaZ

import scalaz.*
import Scalaz.*
// ... Все операции родителей

Ссылки:

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.