Haskell“id”函数必须返回与传入的值相同的要求的类别 - 理论基础是什么?

时间:2015-06-29 18:25:27

标签: haskell category-theory

以下所有内容如何才能成立?

  1. Hask类别中,对象是Haskell类型和 态射是Haskell函数。价值观在Hask中不起作用。
  2. 身份态射被定义为源自对象A并终止于同一对象A的箭头。
  3. 身份态射的作用由Haskell id函数扮演。
  4. 从Haskell id函数返回的值必须与之相同 传入的参数的值。
  5. 如果在类别理论中将身份态射定义为从对象A返回到相同对象A的箭头,那么f :: A -> A类型的任何Haskell函数都不满足该描述吗?

    another question的答案可能也可能涵盖这个主题,但他们似乎对类别理论有一定程度的熟悉,我很遗憾没有。

    在我看来,这是一个非常基本的初级问题。那么有人可以仅使用初学者可以理解的语言,符号和名义构造来提供答案吗?

3 个答案:

答案 0 :(得分:12)

我不确定我是否真的理解你的问题。

但类别中的身份必须满足

id . f = f
g . id = g

适用于任何f,g个正确类型。因此,id不仅仅是任何随机函数A -> A,而是满足上述要求的函数。

请注意,在Hask中,我们可以使用任何值a :: A

id . (const a) = const a

因此

id (const a ()) = const a ()

因此

id a = a

所以id正是我们所期望的。

答案 1 :(得分:6)

id应该是任何给定Haskell类型的标识态射。 Hask 中类型A的识别态射是A -> A类型的函数,但它不仅仅是类型为{{1}的任何函数};它必须遵守类别法。

特别是,对于具有到/来自对象A的态射的合成,它必须是左右标识。如果A -> A是对象A的识别态射,则这意味着任何对象B和态射idAf :: A -> B必须与f . idA完全相同,对于任何对象C和态射fg :: C -> A必须完全相同与ifA . g相同。

我们可以通过选择具体案例来测试您声称任何g类型的函数都可以成为A的身份。让我们将A -> A作为Integer的标识,并考虑函数(+1) :: Integer -> Integer。现在很明显(*2) :: Integer -> Integer(*2) . (+1)(+1) . (*2)都是一样的,所以我们已经展示了 - 哦等等,这些功能完全不同。

注意我的在这里引入了Haskell值的相等性。我在谈论 Hask 类别中态射的平等;在类别理论的范畴内,态射的等同性肯定是 ,因为没有它,关于身份态射的范畴规律是没有意义的。

我一度感到困惑的一个关键点是,尽管考虑具有相同类型的两个不同的对象是没有意义的(因为对象是< / em>类型当我们谈论 Hask )时,你可以有两个不同的状态具有相同的类型。类别理论确实允许在两个对象A和B之间存在几个不同的态射(并且允许从对象到其自身的态射,这些态射是身份态射,并且彼此区分)。态射不是纯粹由他们的&#34;端点&#34;。

定义的

身份法实际上是非常严格的要求,并且应该强烈暗示不仅任何旧(*2)函数将对A -> A执行。有一种清晰的直觉,即能够在不改变它们的情况下与任意其他态射合成,身份态度需要做什么&#34;什么都不做&#34; (无论对于有关类别的意义如何)。

Hask 中我们知道态射是函数,有一个非常明显的解释&#34;什么都不做&#34 ;;只返回其输入的函数。应该清楚的是, 适用于类别法:

idA

此外,如果提议的身份态射执行其他而不是返回其输入(存在一些f . id = f id . f = f x不是badId x ),那么你可以通过尝试与x组合来反驳类别法!

id
假设{p> (badId . id) x badId (id x) badId x 不是badId x,因此x不能等于badId . id(由id定义)。所以id x = x不是作品的左侧身份。

答案 2 :(得分:3)

似乎你对Hask类别和类别有一些常见的误解,但也许它们都归结为

  
      
  1. Hask类别中,Objects是Haskell类型,而Morphisms是Haskell函数。价值观在Hask中不起作用。
  2.   

这并没有多大意义。 Hask中的态射是函数,函数是值,所以从这个意义上说,值已经在Hask中发挥作用。

当且仅当函数f, g :: A -> B相等时,Hask中从A到B的两个态射f和g是相等的,当且仅当对于每个值a :: A时,值{{ {1}}和f a相等。因此,在扩展了这个定义后,我们发现不一定是函数的值(如g a)在Hask中也有一定的作用。

Hask的单位和关联公理在这个意义上是函数的等价,所以他们对价值水平有很多话要说!

先验地,非功能类型的值不会明确地出现在构成Hask类别的(对象,态射,身份,组合规则,单元和关联属性)的清单中。但实际上,值a :: A可以在Hask中编码为态射a :: A,不同的值const a :: () -> A对应于从()到A的不同态射。这是chi&#39中使用的事实;计算显示除了熟悉的a :: A之外,我们对Hask中的对象A上的身份函数没有其他选择。