Есть ли какая-то связь между противоположностью Hom Functor и Scala's Function1?
Функтор Хом Hom(-,-)
является контравариантным в первом аргументе и ковариантным во втором.
Может ли этот факт как-то предложить другое объяснение, почему у Scala Function1[-T1, +R] есть такое же свойство?
Я видел это утверждение, сделанное, например, здесь, но в тот момент, когда должна была быть объяснена связь между этими двумя понятиями, было так много размахиваний рукой, что это сдуло меня.
2 ответа
Существует две категории типов Scala.
Одна из них - это обычная категория типов и функций, где типы - это объекты, а стрелки - функции.
Другая - это категория типов и подтипов, где типы - это объекты, а отношения подтипов - это стрелки. Эта категория является poset.
Ковариантность и контравариантность в Scala - это как раз ковариантность и контравариантность эндофункторов в этой последней категории.
Теперь вторая категория оказывается подкатегорией первой из-за проекционных стрелок, которые отображают подтипы в супертипы. Эти стрелки первой категории являются точно (всеми) стрелами второй категории. Таким образом, каждый ковариантный эндофунктор первой категории естественным образом (то есть посредством естественного преобразования) является ковариантным эндофунктором второй категории.
Действительно, если функтор F
карты A
в A'
а также B
в B'
и каждая стрела f: A -> B
стрелке f': A' -> B'
, и если A
это подтип B
затем стрелка проекции prj_A,B
отображается на проекционную стрелку prj_A',B'
и если таковой существует, то A'
это подтип B
". То же самое и с контравариантными функторами.
Теперь осталось только увидеть, что Function1
в некотором смысле функтор Хома. Действительно, если мы видим тип Scala как набор его значений, то Function1[A,B]
это набор морфизмов (функций Scala) из A
в B
, Отображение стрелок задается композицией. И поскольку он ковариантный (контравариантный) в первой категории, он должен быть также ковариантным (контравариантным) во второй категории.
Редактировать: исправлена путаница подтипов / супертупов.
Отказ от ответственности: я никогда не изучал теорию категорий. Я могу или не могу знать, о чем я говорю.
Вероятно, нет, если вы осторожны с настройкой. Function1 очень похож на (объектную часть) функтора Hom, за исключением того, что его цель не совсем той же категории. Цель отображения Function1 (подкатегория) scala
категория с типами Scala в качестве объектов и функциями в виде стрелок; в то время как целью функтора Hom является (подкатегория) SET. Их изображения, вероятно, изоморфны, но не ясно, что объединение двух функторов и изоморфизма сохраняет структуру так, как вам нужно, чтобы дисперсия сохранялась по всей цепочке.