[英]“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
法。
您正确地将函数组合和关系组合识别为关联操作,然后似乎在问这个问题:
既然我们称之为组合的所有操作都已经被证明是关联的,为什么我们要让关联性成为组合操作的要求呢?
这个问题有两个微妙的错误。
让我们按照第(2)点的风格来做一些例子。 我们将首先建立一个我们感兴趣的数学结构,然后我们会问:如果我们愿意,我们可以称它为一个范畴吗?
具有函数组合的集合
假设我提出了以下数学结构:
这个结构是一个类别吗? 正如您在问题中正确观察到的那样,答案是yes ,因为:
带加法的数字
这是一个稍微简单的结构:
请注意,在这个结构中,我们定义的组合操作既不是函数组合也不是关系组合! 我们现在要问的问题是:当我们将标签组合附加到这个操作时,我们是在自欺欺人,还是这样称呼它是明智的?
在这种情况下,答案是肯定的,我们可以将其称为组合(并将整个结构称为类别),因为:
带加法的正数
对上一个示例的这个轻微修改如何:
我可以称之为一个类别吗? 这种关系是我可以附加标签“组合”的东西吗? (注意,操作本身和之前的操作是一样的!)在这种情况下,答案是否定的,我们不应该把这个结构称为范畴,也不应该把这个操作称为组合,因为虽然操作是关联的,但没有箭头会在与其他箭头组合时使其他箭头保持不变。
具有奇怪指数的数字
另一种结构:
我们可以将这种结构称为类别吗? 我们可以将最终操作标记为“组合”吗? 在这种情况下,答案是否定的,因为虽然有一个箭头将其他人单独留在组合下(即 0),但声称的组合操作不是关联的:
2^(1^2) = 2^1 = 2
(2^1)^2 = 2^2 = 4
通过一些工作,我们可以制作出更巧妙的例子,以更微妙的方式(例如,通过关联,但只有片面的身份)不符合类别定律。 但现在我希望模式是明确的:类别定律是我们所需要的,我们在每种情况下做出的决定都是关于我们感兴趣的数学结构是否是我们可以称之为“类别”的东西。 (当然,即使这个问题的答案是否定的,我们仍然可以对它感兴趣并研究它!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.