前段时间我读过函数类型a -> b
对应于a ≤ b
的关系,还是a ≥ b
?这对我来说是有道理的,因为如果我们在它们之间有双射(即(a ≈ b) ≡ (a -> b, b -> a)
),则两种类型是同构的。同样,(a = b) ≡ (a ≤ b) ∧ (a ≥ b)
。
我知道这不是Curry-Howard-Lambek的对应关系(即类型理论,逻辑和范畴理论之间的对应关系)。它是类型理论与其他东西之间的对应关系。我想知道更多关于这种信件的信息。有人能指出我正确的方向吗?
我知道这似乎不是一个编程问题,但它与编程有关,我希望某些功能程序员能够更多地了解它并指出我正确的方向。
答案 0 :(得分:9)
每个预先订购的集合都会形成一个类别。让(S, «)
成为预先订购的集合。定义一个类别C
,其对象是S
和Hom(a, b)
的元素,(a, b)
如果a « b
,则无人居住。尽可能以唯一的方式定义构图。类别法立即遵循预订的传递性和反身性。
功能良好的函数式语言中的类型和函数也构成了具有有限产品和副产品以及初始和最终对象的类别。因此,如果你眯着眼睛看到分类模糊,那么这些东西看起来会变得模糊不清。
答案 1 :(得分:3)
(这更多是评论而不是答案,但我需要更多空间。)
a -> b
类型对应a <= b
。这很有用,例如,谈论类型级别的固定点,这是正确定义递归类型(列表,树,......)所必需的。
回想一下,如果没有类别,递归是如何解决的。在领域理论中,给定函数f :: a -> a
,我们寻找至少x
满足f x = x
(最不确定点)。结果也是最少x
满足f x <= x
(最少前缀点)。然后我们得到归纳原理
f y <= y ==> fix f <= y
基本上说明,如果我们有任何前缀点y
,那么最小(前)固定点fix f
必须小于y
- 实际上,它是最少的!
现在,让我们在上面撒一些粉末。含义变为->
箭头,<=
也变为->
。我们得到
(f y -> y) -> fix f -> y
看起来很熟悉,我在哪里看到......?啊!
newtype Fix f = Fix { unFix :: f (Fix f) }
cata :: Functor f => (f y -> y) -> Fix f -> y
cata g = g . fmap (cata g) . unFix
因此,cata
一般消除器/变形现象只是旧的归纳原则的类别授权版本。
请注意域名y
现在是否属于我们的类别(即类型)。此外,函数f
必须适用于y
,因此这些不是我们类别中的态射(函数值 :: A -> B
,从某种类型到某些类型类型),但对应于类型类别的函子(映射类型为类型:: * -> *
)。