может ли кто-нибудь объяснить связь между ковариантностью/контравариантностью типов и теорией категорий?

Я только начинаю читать о теории категорий и был бы очень признателен, если бы кто-нибудь мог объяснить связь между контравариантностью/ковариантностью CS и теорией категорий. Какими могут быть некоторые примеры категорий (т.е. каковы их объекты/морфизмы?)? Заранее спасибо?


person gatoatigrado    schedule 26.06.2010    source источник


Ответы (2)


Контравариантный функтор из $C$ в $D$ — это то же самое, что и нормальный (т.е. ковариантный) функтор из $C$ в $D^{op}$, где $D^{op}$ — категория, противоположная $D$. Так что, вероятно, лучше сначала понять противоположные категории — тогда вы автоматически поймете контравариантные функторы!

Контравариантные функторы не так часто встречаются в CS, хотя я могу вспомнить два исключения:

  1. Возможно, вы слышали о контравариантности в контексте подтипирования. Хотя технически это один и тот же термин, связь действительно очень слабая. В объектно-ориентированном программировании классы формируют частичный порядок; каждый частичный порядок является категорией с «бинарными хом-множествами» — для любых двух объектов $A$ и $B$ существует ровно один морфизм $A\to B$ тогда и только тогда, когда $A\leq B$ (обратите внимание на направление; эта немного запутанная ориентация является стандартом по причинам, которые я не буду здесь объяснять) и никаких морфизмов в противном случае.

    Параметризованные типы, такие как, скажем, PartialFunction[-A,Unit] в Scala, являются функторами из этой простой категории для самого себя... мы обычно фокусируемся на том, что они делают с объектами: учитывая класс X, PartialFunction[X,Unit] также является классом . Но функторы также сохраняют морфизмы; в этом случае, если бы у нас был подкласс Dog от Animal, у нас был бы морфизм Dog$\to$Animal, и функтор сохранил бы этот морфизм, дав нам морфизм PartialFunction[Animal,Unit]$\to$PartialFunction[Dog, Unit], сообщая нам, что PartialFunction[Animal,Unit] является подклассом PartialFunction[Dog,Unit]. Если подумать, в этом есть смысл: предположим, у вас есть ситуация, когда вам нужна функция, которая работает на Dogs. Функция, которая работает со всеми животными, безусловно, будет работать и там!

    Тем не менее, использование полной теории категорий, чтобы говорить о частично упорядоченных множествах, является излишним.

  2. Менее распространен, но на самом деле использует теорию категорий: рассмотрим категорию Types(Hask), объекты которой являются типами языка программирования Haskell и где морфизм $\tau_1\to\tau_2$ является функцией типа $\tau_1$-> $\тау_2$. Существует также категория суждений (Hask), объектами которой являются списки суждений о типах $\tau_1\vdash\tau_2$, а морфизмами которых являются доказательства всех суждений из одного списка с использованием суждений из другого списка в качестве гипотез. Существует функтор от Types(Hask) к Judgments(Hask), который переводит Types(Hask)-морфизм $f:A\to B$ в доказательство

     B |- Int
    ----------
      ......
    ----------
     A |- Int

который является морфизмом $(B\vdash Int)\to(A\vdash Int)$ -- обратите внимание на изменение направления. По сути, это говорит о том, что если у вас есть функция, которая превращает A в B'a, и выражение типа Int со свободной переменной x типа B, то вы можете обернуть это выражением «let x = f y in . .." и получить выражение по-прежнему типа Int, но единственная свободная переменная которого имеет тип $A$, а не $B$.

person Adam    schedule 02.05.2011

Есть очень хорошие видеоролики о контравариантности/ковариантности в канале Going Deep в Microsoft Channel9. Вы можете начать здесь:

person Tuomas Hietanen    schedule 20.07.2010
comment
Очень очень даже приятно. Спасибо, что поделился. Я надеюсь, что когда-нибудь они придумают 4 из N! :) - person Camilo Martin; 16.11.2010