下面这些怎么可能都是真的?
- 在
Hask
类别中,对象是Haskell类型态射是Haskell函数。值在Hask
中不起作用 - 身份变形被定义为起始于对象
A
并终止于同一对象A
的箭头 - 身份变态的作用是由Haskell
id
函数发挥的 - Haskell
id
函数返回的值必须与传入的参数的值
如果恒等态射在范畴论中被定义为从对象A返回同一对象A的箭头,那么f :: A -> A
类型的任何Haskell函数都不满足这种描述吗?
还有一个问题的答案可能也涵盖了这个话题,但它们似乎对范畴理论有一定程度的熟悉,不幸的是,我不具备这一点。
在我看来,这是一个非常基本的初级问题。那么,有人能只用初学者能理解的语言、符号和概念结构来提供答案吗?
我不确定我是否真的理解你的问题。
但类别中的身份必须满足
id . f = f
g . id = g
对于正确类型的任何CCD_ 8。所以id
不仅仅是任意一个随机函数A -> A
,它是满足上述要求的函数。
注意,在Hask中,对于任何值a :: A
,我们都有
id . (const a) = const a
因此
id (const a ()) = const a ()
因此
id a = a
所以id
确实是我们所期望的。
id
被认为是任何给定Haskell类型的恒等态射。在Hask中,类型a的识别态射是类型A -> A
的函数,但它不仅仅是任何类型A -> A
的函数;它必须服从范畴规律。
特别地,对于具有到/来自对象a的态射的合成,它必须是左和右恒等式。如果idA
是对象a的识别态射,则这意味着对于任何对象B和态射f :: A -> B
,f . idA
必须与f
完全相同,并且对于任何对象C和态射g :: C -> A
,ifA . g
必须与g
完全相同。
我们可以通过选择一个具体的案例来测试您的说法,即任何类型为A -> A
的函数都可以是A的恒等式。让我们取(+1) :: Integer -> Integer
作为Integer的恒等式,并考虑函数(*2) :: Integer -> Integer
。很明显,(*2) . (+1)
、(+1) . (*2)
和(*2)
都是一样的,所以我们已经展示了——哦,等等,它们根本不是同一个函数。
注意,我在这里引入了Haskell值的相等性。我说的是Hask范畴中态射的相等性;并且态射的等式在范畴论的范畴内是,因为没有它,关于同一态射的范畴律是没有意义的。
我一度感到困惑的一个关键点是,尽管考虑具有相同类型的两个不同的对象是没有意义的(因为当我们谈论Hask时,是类型),但可以具有两个相同类型的不同态射。范畴论确实允许在两个对象A和B之间存在几个不同的态射(并且确实允许存在从对象到自身的态射,这些态射是而不是同一态射,并且彼此不同)。语素并不是纯粹由它们的"端点"来定义的。
身份法则实际上是非常严格的要求,并且应该强烈暗示,不仅仅是任何旧的A -> A
函数都可以用于idA
。有一种明确的直觉是,为了能够在不改变任意其他态射的情况下与它们组合,恒等态射需要"什么都不做"(无论这对所讨论的类别意味着什么)。
在Hask中,我们知道态射是函数,对"无所事事"有一个非常明显的解释;只返回其输入的函数。应该清楚的是,这确实适用于分类法:
f . id = f
id . f = f
此外,如果一个提出的恒等态射除了返回其输入不变(存在一些x
,使得badId x
不是x
)之外做任何其他的事情,那么你可以通过尝试用id
组合来反驳范畴定律!
(badId . id) x
badId (id x)
badId x
假设badId x
不是x
,所以badId . id
不可能等于id
(由id x = x
定义)。因此CCD_ 40不是一个左恒等式。
您似乎对类别Hask和一般类别有几个常见的误解,但也许它们都归结为
- 在
Hask
类别中,Object是Haskell类型,Morphism是Haskelle函数。值在Hask
中不起作用
这真的没有道理。Hask中的态射是函数,函数是值,所以在这个意义上,值确实在Hask中发挥了作用。
Hask中从A到B的两个态射f和g是相等的,当且仅当函数f, g :: A -> B
相等,这反过来又成立,当且只当对于每个值a :: A
,值f a
和g a
相等。因此,在扩展了这个定义后,我们看到不一定是函数的值(如a :: A
)在Hask中也有一定的作用。
Hask的单位公理和结合公理在这个意义上是函数的等式,所以它们在价值层面上确实有很多话要说!
先验地,非函数类型的值不会显式地出现在包括类别Hask的(对象、态射、恒等式、组合规则、单位和关联属性)的清单中。但实际上,值a :: A
可以在Hask中编码为态射const a :: () -> A
,不同的值a :: A
对应于从()到A的不同态射。这是chi计算中使用的事实,表明除了熟悉的id :: A -> A; id a = a
之外,我们对Hask中对象A上的恒等函数没有其他选择。