【问题标题】:Is there any connection between the contravarience of Hom Functor and Scala's Function1?Hom Functor 的逆变性和 Scala 的 Function1 之间有什么联系吗?
【发布时间】:2016-05-29 04:51:16
【问题描述】:

Hom functorHom(-,-) 在第一个参数中是逆变的,在第二个参数中是协变的。

这个事实能否以某种方式提供另一种解释,为什么 Scala 的 Function1[-T1, +R] 具有相同的属性?

我看到过这种说法,例如 here,但是在应该解释这两个概念之间的联系时,有太多的挥手让我大吃一惊。

【问题讨论】:

  • 我已经删除了haskell,因为它似乎与问题完全无关。如果您关心 haskell,则必须明确指定与 haskell 相关的问题。

标签: scala functor category-theory bifunctor


【解决方案1】:

Scala 类型有两类。

一个是通常的类型和函数类别,其中类型是对象,箭头是函数。

另一个是类型和子类型类别,其中类型是对象,子类型关系是箭头。这个类别是一个poset。

Scala 中的协变和逆变正是后一类内函子的协变和逆变。

现在第二个类别恰好是第一个类别的子类别,因为投影箭头将子类型映射到超类型。第一类的这些箭头正是(所有)第二类的箭头。因此,第一类的每个协变内函子自然地(即通过自然变换)是第二类的协变内函子。

确实,如果函子 FA 映射到 A'BB' 并且每个箭头 f: A -> B 映射到箭头 f': A' -> B',并且如果 A 是 @ 的子类型987654329@,那么投影箭头prj_A,B映射到投影箭头prj_A',B',如果存在,那么A'B'的子类型。逆变函子也是如此。

现在只剩下看到Function1 在某种意义上是 Hom 函子。实际上,如果我们将 Scala 类型视为其值的集合,那么Function1[A,B] 是从AB 的一组态射(Scala 函数)。箭头映射由合成给出。而且既然在第一类是协变(逆变)的,那么在第二类也一定是协变(逆变)的。

编辑:更正子类型/超元组混淆。

免责声明:我从未研究过范畴论。我可能知道也可能不知道我在说什么。

【讨论】:

  • 我只是在阅读这个很棒的答案并想:“哇,很棒的答案,他一定很了解范畴论”,然后我阅读了免责声明..哈哈。不过,很好的答案。
  • @n.m.你说从 SET 上的每个协变内函子到 POSET 上的每个协变内函子都有一个自然的转换。怎么可能?首先,NT 是在两个函子上定义的,它们从同一个源类别开始,到同一个目标类别结束。这不是 SET 和 POSET 的情况。其次,NT 保留了类别的内部结构。同样,情况并非如此。 SET 中的许多集合由 POSET 中不存在的态射连接。
  • @rapt 第一个类别不是 SET,它是 SCALA,Scala 类型和函数的类别)。相似但不一样。第二类不是 POSET(我的坏、错误的符号系统已修复),它是 a poset。 (每个poset都是一个类别)。称之为 SCALA-2。 SCALA-2 是 SCALA 的一个子类别,当您将 SCALA 上的内函子限制为 SCALA-2 时,自然转换就会自然产生。
  • @n.m.您能否更详细地解释您在最后一段中试图展示的内容以及您的动机是什么(“现在只剩下看到 Function1 ......”)。这有点过于电报了..
  • @rapt 嗯,正如我所说,我不是范畴理论家,我可能会遗漏一些东西。最后一段有什么不清楚/可疑的地方?
【解决方案2】:

如果您小心设置,可能不会。 Function1 非常类似于 Hom 函子(的对象部分)——除了它的目标不是 相当 相同的类别。 Function1 映射的目标是scala 类别(其子类别),该类别将Scala 类型作为对象,将函数作为箭头;而 Hom 函子的目标是 SET(的子类别)。它们的图像可能是同构的,但尚不清楚将两个函子和同构相结合是否会以您需要的方式保留结构,以便在整个链中保留方差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多