Haskell wiki 中的“类别法”

smo*_*ing 0 haskell functional-programming category-theory

根据 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 假设的人)认为态射的组合不是结合违反规则的?

谢谢。

dan*_*iaz 6

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

数据类型简单地包含在一个用一些Int值注释的函数中:

import Prelude
import qualified Control.Category as C

data Subs a b = Subs Int (a -> b)
Run Code Online (Sandbox Code Playgroud)

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

instance C.Category Subs where
    id = Subs 0 Prelude.id
    (Subs x f) . (Subs y g) = Subs (y - x) (f . g)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这返回

-11
-5
Run Code Online (Sandbox Code Playgroud)

表明作文的顺序很重要,违反了Category法律。