要求 Haskell "id" 函数必须返回与传入相同的值的范畴理论基础是什么?



下面这些怎么可能都是真的?

  1. Hask类别中,对象是Haskell类型态射是Haskell函数。值在Hask中不起作用
  2. 身份变形被定义为起始于对象A并终止于同一对象A的箭头
  3. 身份变态的作用是由Haskell id函数发挥的
  4. 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 -> Bf . idA必须与f完全相同,并且对于任何对象C和态射g :: C -> AifA . 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和一般类别有几个常见的误解,但也许它们都归结为

  1. Hask类别中,Object是Haskell类型,Morphism是Haskelle函数。值在Hask中不起作用

这真的没有道理。Hask中的态射是函数,函数是值,所以在这个意义上,值确实在Hask中发挥了作用。

Hask中从A到B的两个态射f和g是相等的,当且仅当函数f, g :: A -> B相等,这反过来又成立,当且只当对于每个值a :: A,值f ag a相等。因此,在扩展了这个定义后,我们看到不一定是函数的值(如a :: A)在Hask中也有一定的作用。

Hask的单位公理和结合公理在这个意义上是函数的等式,所以它们在价值层面上确实有很多话要说!

先验地,非函数类型的值不会显式地出现在包括类别Hask的(对象、态射、恒等式、组合规则、单位和关联属性)的清单中。但实际上,值a :: A可以在Hask中编码为态射const a :: () -> A,不同的值a :: A对应于从()到A的不同态射。这是chi计算中使用的事实,表明除了熟悉的id :: A -> A; id a = a之外,我们对Hask中对象A上的恒等函数没有其他选择。

最新更新