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 假设的人)认为态射的组合不是结合违反规则的?
谢谢。
这是一个不是有效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法律。