13

这个问题有一个很长的前奏,然后我才能真正问出来:)

假设类型 A 和 B 代表类别,那么函数

f :: B -> A

是两个范畴之间的态射。我们可以创建一个新类别,其中 A 和 B 作为对象,f 作为箭头,如下所示:

在此处输入图像描述

现在,让我们引入一个新的类别 C 和函数 g:

g :: C -> B -> A

我希望能够将 C 和 g 添加到我上面的类别中,但我不确定该怎么做。直观地说,我想要这样的东西:

在此处输入图像描述

但我以前从未在类别图中看到过类似的东西。为了使这个洁净,我可以引入一个虚拟箭头 g' 并构造一个像这样的 2 类:

在此处输入图像描述

但这似乎是一个迟钝的画面。(当然,我们可以使用我上面画的图片作为正确图片的简写。)而且,现在也不完全清楚 g 和 g' 到底是什么。g 不再是一个将类别 C 作为输入并返回态射 :: B -> A 的函数。相反,

g' :: (C -> C)

g :: (C -> C) -> (B -> A)

如果我们通过 g 身份,那么一切都会正常工作。但是如果我们给它传递一些其他函数,那么谁知道会发生什么?

所以我的问题是:n 类别中的 n 箭头真的是我们应该考虑具有 arity n 的函数的方式吗?还是有一些更简单的方法可以将此功能表示为我错过的标准类别?

4

2 回答 2

12

在这里谈论“类别之间的态射”听起来像是一个可能的类别错误(哈,哈)。在 Haskell 中,我们最常谈论所谓的类别Hask,它是该类别的一些不一致理想化(0)版本,其对象是种类的类型,*而态射是函数。如果它们不是Hask的态射,则不清楚类别之间的“功能”是什么。

另一方面,在更一般的设置中,您当然可以定义一个类别,其对象是其他类别(1),具有您想要的任何态射,以满足必要的属性。通常的例子是Cat,它的态射是函子的小范畴的范畴。

也就是说,无论哪种情况,您的问题的答案都基本相同。要谈论两个对象之间的态射集合,就好像该集合本身就是一个对象——即,作为其他态射的源或目的地——你需要一个对象来扮演这个角色,并且需要某种方式来间接谈论态射,以便你可以来回翻译。

如果我们已经有一种方法可以将对象对作为单个对象(通常称为某种“乘积”)进行讨论,那么一种方法是定义态射集合 A⊗B→C 和态射 A→C B的集合,它允许对象 C B代表态射 B→C 的集合。

如果所讨论的“对象对”实际上是一个分类积,我们就有一个笛卡尔封闭范畴HaskCat都是。在 Haskell 中,上述等价是函数curryuncurry(2)

当然,这不是谈论态射作为对象的唯一方式。一般概念简称为“封闭范畴”。但是,如果您正在考虑高阶函数和函数式编程,那么您可能会想到一个笛卡尔封闭类别。


(0)这通常涉及诸如假装 ⊥ 不存在(因此所有函数都是总函数)以及将产生相同输出的函数视为相同的事情(例如,忽略性能差异)。

(1)但不要试图谈论对象都是类别的类别,否则Bertrand Russell会给你生意。

(2)当然,以逻辑学家 Haskell Curry 的名字命名。

于 2012-09-24T20:25:03.727 回答
4

我在类别理论方面相当未受过教育,但是:

在 Haskell 编程中,我们经常(假装我们)使用类别Hask,其对象是 Haskell 类型,态射是 Haskell 函数。

将这种理解应用于您的示例,我看到BandA是对象,并且f是它们之间的态射。

g然而不是C和之间的态射f,所以不应该尝试在和g之间绘制箭头。Cf

如果我们应用类型构造函数的右关联性->,我们得到g :: C -> (B -> A). B -> A本身是 Haskell 类型,因此本身应该是Hask的对象。f然而不是那个对象;它是类型中的一个特定值B -> A,但B -> A对象将是类型本身。

纯粹用 Haskell 术语思考也是有意义的。仅仅因为g应用于一个类型的值C给了我们一些类型的函数B -> A,这并不意味着它g的返回值与f其他类型的函数有任何关系B -> A

所以这给了我们f一个在对象B和对象之间绘制的态射A,以及g作为在对象C和对象之间绘制的态射B -> A

这是我的类别理论知识分解的地方。f似乎很明显,和对象之间应该存在某种关系B -> A,因为在 Haskellf中是类型中的值B -> A。我不知道在范畴论方面这种关系是什么。

CA McCann 的回答听起来像是您需要通过一些不直接由类别建模的“额外”关系来处理它。因此,就类别而言,对象B -> A也可以称为D; 它与其他任何东西都没有关系,除非由将它连接到其他对象的态射给出。只有结合类别“外部”的其他信息,我们才能识别ABfD(真的B -> A)之间的联系。但我可能误解了这个描述。

于 2012-09-25T00:11:37.560 回答