繁体   English   中英

Haskell wiki 中的“类别法则”

[英]“Category laws” in Haskell wiki

根据 Haskell 维基,

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)

但是,因为减法不是关联的,所以该实例无效!

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 的箭头。
  • 为了组合两个箭头,我们使用集合论中的标准函数组合。

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

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

带加法的数字

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

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

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

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

  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

通过一些工作,我们可以制作出更巧妙的例子,以更微妙的方式(例如,通过关联,但只有片面的身份)不符合类别定律。 但现在我希望模式是明确的:类别定律是我们所需要的,我们在每种情况下做出的决定都是关于我们感兴趣的数学结构是否是我们可以称之为“类别”的东西。 (当然,即使这个问题的答案是否定的,我们仍然可以对它感兴趣并研究它!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM