haskell - 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 假设的社区)认为态射的组合不是关联违反规则的?
谢谢。
解决方案
这是一个不是有效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
法律。
推荐阅读
- maven - 如何在 Maven 的继承子依赖项中排除父 pom 依赖项?
- angularjs - AngularJS:如何使用存储在 cookie 中的计时器倒计时使页面在一段时间内处于非活动状态?
- node.js - nuxtjs中的不匹配vue包错误
- magnolia - 执行操作时发生错误
- c# - 如何在 Task.WhenAll 中分配变量
- docker - 如何基于每个 pod 从 Kubernetes 向 GELF UDP 端点发送日志
- jquery - 简单回调函数未按预期工作
- .htaccess - 301重定向到错误的url
- android - 使用 Clang 作为编译器构建 Android 项目时从静态库中隐藏符号
- php - 如果某个数组中的值等于另一个数组中的值,则更改该数组中的值