Haskell Wiki中的“类别法”

问题描述

根据Haskell Wiki,

https://en.wikibooks.org/wiki/Haskell/Category_theory#Category_laws

类别法 类别需要遵循三个定律。首先,最简单的是,态素的组成必须具有关联性。

但是,

关系的构成具有关联性

https://en.wikipedia.org/wiki/Composition_of_relations#Properties

功能组成始终是关联的

https://en.wikipedia.org/wiki/Function_composition#Properties

那么,在什么情况下,Haskell社区(或Wiki假设的社区)认为,态射的构成并没有违反规则?

谢谢。

解决方法

这里的数据类型/操作组合不是有效的Category实例。

数据类型仅包含一个带有一些Int值的函数:

import Prelude
import qualified Control.Category as C

data Subs a b = Subs Int (a -> b)

这是伪造的Category实例。合成执行注释的减法:

instance C.Category Subs where
    id = Subs 0 Prelude.id
    (Subs x f) . (Subs y g) = Subs (y - x) (f . g)

但是,由于subtraction is not associative,该实例无效!

main :: IO ()
main = do
    let Subs u _ = (Subs 3 id) C.. ((Subs 10 id) C.. (Subs 2 id))
        Subs v _ = ((Subs 3 id) C.. (Subs 10 id)) C.. (Subs 2 id)
    print u
    print v

这将返回

-11
-5

表明构成顺序很重要,与Category法则相反。

,

您正确地将功能组合和关系组合标识为关联操作,然后出现以下问题:

既然我们称为合成的所有操作都已被证明是关联的,那么为什么我们将关联性作为合成操作的要求呢?

这个问题有两个细微的错误。

  1. 您假设我们称为复合的操作集合仅包含函数和关系复合。但是事实并非如此:我想我可以在一段时间内写下20-30个不同的合成操作,每个类包含无限数量的实际合成操作!
  2. 您假定的因果关系是倒数。我们不是从一堆不同的事物开始,然后决定要求它们具有关联性。相反,首先,我们确定一些我们喜欢的条件(关联性,具有身份,类型正确),然后允许我们自己将“组成”标签附加到满足这些条件的任何操作上。

让我们以点(2)的样式为例。我们将首先建立一个我们感兴趣的数学结构,然后问:是否可以将其称为类别?

具有功能组合的设置

假设我提出了以下数学结构:

  • 有大量的对象,每组可能一个。 (该陈述不能用集合论来表述!但这没关系。如果我们不想这样做,我们就没有必须来进行集合论。)
  • 每对对象都有一个箭头集合;也就是说,对于集合X和Y,每个函数的域为X且共域为Y的每个函数都有一个类型为X-> Y的箭头。
  • 要组成两个箭头,我们使用集合论中的标准函数组合。

此结构是类别吗?正如您在问题中正确观察到的那样,答案是,因为:

  1. 对于任何对象X,我们都可以创建类型为X-> X的箭头,对于该箭头,与其他箭头组成的对象将不起作用(即,函数将返回其输入不变)。
  2. 正如您正确观察到的,我们可以证明功能组合是有关联的。

带加号的数字

这是一个稍微简单的结构:

  • 只有一个对象,名为X。
  • 有一个X类型的箭头集合-> X;该集合中的每个自然数都有一个箭头。
  • 要组成代表数字m和n的箭头,请产生代表数字m + n的箭头。

请注意,在此结构中,我们定义的合成操作既不是 函数合成也不是关系合成!我们现在要问的问题是:在将标签组合物附加到此操作时,我们是在自欺欺人吗?还是称呼它为明智之举?

在这种情况下,答案是,我们可以称其为composition(并将整个结构称为类别),因为:

  1. 我们可以创建一个类型为X-> X的箭头,对于该箭头,与其他箭头组成的东西什么都不做(即,代表数字0的箭头)。
  2. 众所周知,加法是关联的。

带加号的正数

对前面的示例进行一下轻微的修改怎么样?

  • 只有一个对象,名为X。
  • 有一个X类型的箭头集合-> X;此集合中的每个正自然数都有一个箭头。
  • 要组成代表数字m和n的箭头,请产生代表数字m + n的箭头。

我可以将其称为类别吗?我可以在标签上加上“组成”这个标签吗? (请注意,该操作本身是与以前相同的 操作!)在这种情况下,答案是 ,我们不应该将此结构称为一个类别,我们不应该将此操作称为组合,因为尽管该操作是关联的,但没有箭头可以使其他箭头与它们组合时保持不变。

具有奇数幂的数字

另一种结构:

  • 只有一个对象,名为X。
  • 有一个X类型的箭头集合-> X;该集合中的每个自然数都有一个箭头。
  • 要组合箭头m和n:
    • 如果m或n中的任何一个为0,则返回另一个。例如,0和1的组成是1; 2和0的组成是2;并且0和0的组成是0。
    • 否则,取幂m ^ n。

我们可以将此结构称为类别吗?最终操作是否可以标记为“组成”?在这种情况下,答案是 ,因为尽管有一个箭头使其他人独自处于合成状态(即0),但是声称的合成操作并不具有关联性:

2^(1^2) = 2^1 = 2
(2^1)^2 = 2^2 = 4

通过一些工作,我们可以弄出一些更精美的示例,这些示例甚至以更微妙的方式(例如,通过关联但只有一个侧面的身份)未能通过类别定律。但是,到目前为止,我希望这种模式是明确的:类别定律是我们所使用的desiderata,并且在每种情况下,我们所做出的决定都是关于我们感兴趣的数学结构是否可以称为“类别”。 (当然,即使该问题的答案为否,我们仍然可以对它感兴趣并对其进行研究!)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...