不完全理解`F(1A)= 1F(A)∀A∈C1`作为Functor定律

Fre*_*ind 2 functional-programming scala functor category-theory

我正在阅读有关scala中的类别和Functor的这篇文章:https://hseeberger.wordpress.com/2010/11/25/introduction-to-category-theory-in-scala/

在这部分:

为了保留类别结构,此映射必须保留标识映射和组合.更正式的:

F(1 A)= 1 F(A) ∀A∈C1

F(gοf)= F(g)οF(f)∀f:A→B,g:B→C其中A,B,C∈C1

我无法理解:F(1 A)= 1 F(A)

为什么正确的部分是1 F(A)而不是F(A)

我在其他文章中看到,Functor的身份法是:

fa.map(a => a) == fa
Run Code Online (Sandbox Code Playgroud)

与1 F(A)无关

M.K*_*.K. 6

我认为你对符号所代表的含义感到困惑.

1 A代表身份箭头,它只是从类别中的对象A到其自身的箭头/映射,即A - > A.

类似地,1 F(A)表示身份函子,其仅是从仿函数F(A)到其自身的箭头,即F(A) - > F(A).

因此,箭头1 F(A)与仿函数F(A)不同,因此如你所说,1 F(A) = F(A)是错误的.

要回答您的问题为何F(1 A)= 1 F(A),请根据以上说明考虑以下内容:

F(1 A)= F(f:A - > A)= F(f):F(A) - > F(A)= 1 F(A)

现在我们已经清除了符号的含义,代码片段与函子定义一致:

fa.map(a => a) == fa
Run Code Online (Sandbox Code Playgroud)

fa是一个仿函数,地图使用标识函数将仿函数的每个元素映射到自身.这将再现一个与原始仿函数相当的仿函数fa,因此该映射可以在类别理论的语言中表示为1 F(A).

因此,您可以看到在分类理论中存在箭头和对象的概念,在查看符号时您必须能够区分和理解.如果你真的对这个主题感兴趣,我强烈推荐阅读Steve Awodey的分类理论的第一章.