首页 > 解决方案 > 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 假设的社区)认为态射的组合不是关联违反规则的?

谢谢。

标签: haskellfunctional-programmingcategory-theory

解决方案


这是一个不是有效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)

但是,因为减法不是 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法律。


推荐阅读