C++中的functor是否是范畴论意义上的functor?

4

C++中的函数对象是一个支持重载运算符()的类。这是否与范畴论中的函数子相同?它们的对象和态射是什么?


对我来说,这个问题没有多少意义。这就像问“C/C++运算符是否是https://en.wikipedia.org/wiki/Operator_(mathematics)中所述的运算符?”答案取决于上下文:*是*,*不是*,*可能是*。 - user719662
我的原始意图是以下内容。例如,C#中与泛型类型参数相关的逆变和协变关键字实际上等于范畴论中它们的含义。我怀疑C++中的函子具有范畴论意义,但我不知道它是什么。 - Shuheng Zheng
在计算机科学中,逆变和协变与它们在数学中的对应物在含义上是类似的,但它们并不相等。即使在函数式编程中,这些术语的特点仍然与它们在数学中的对应物有所不同(例如arity、currying等)。通常来说,“一个科学领域的术语是否与另一个科学领域的同名术语在语义上相等”几乎没有意义。计算机科学与数学也不例外。同名术语通常用于表示类似/类比的概念,但很少表示相等的概念。"Functor"也不例外;在数学中,它是一种映射,在计算机科学中,该术语可能表示一种映射。 - user719662
3个回答

4
不,正如Hurkyl所说,尽管在面向对象编程中“objects”所暗示的名称冲突,但OOP函子与范畴论函子无关。更好的匹配OOP的方式是将OOP的“class”重命名为“category”,将类型之间的转换作为函子。类似这样:
category Shape;
category Rectangle : forgetful functor Shape;
category Polygon : forgetful functor Shape
{
    functor Polygon( Rectangle & );
};

替代
class Shape;
class Rectangle : public Shape;
class Polygon : public Shape
{
    implicit Polygon( Rectangle & );
};

遗憾的是,发明面向对象编程的人和发明范畴论的人不是同一批人,因此使用的术语不同。


3

不。

我认为最不容易引起混淆的方式来称呼C++中的“functors”是“function object”。

在Java中,我猜一个带有调用运算符的对象被称为“callable”,但在C++中,它具有稍微更广泛的含义,包括任何函数指针或其他可以使用“call”语法的东西。

这只是数学中某些技术术语被计算机科学家用来表示与其原始含义基本无关的事物的例子之一。例如,“网络拓扑”这个词,人们用它来描述网络的布局。这实际上与“拓扑”的数学含义没有什么关系,后者关注于在任意连续变换下保持不变的空间属性。也就是说,“一个拓扑学家是一个不能分辨咖啡杯和甜甜圈的数学家”。通常,在我看来,对于人们谈论计算机网络所关心的大多数目的,讨论计算机网络的“网络几何”会更有意义,因为他们关心的事情包括节点之间的距离、密度、瓶颈等,这些大多数不是拓扑性质。但这只是我的小抱怨。 :)


1
据我所知,"functor" 一词作为函数对象的词源是一个“执行某些操作的东西”(因此使用像 ----or 这样的命名模式),其中这些操作仅仅是一个函数,而其他名称如 'functionor' 或 'functionator' 听起来很别扭。请注意保留 HTML 标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接