库里霍华德对应和平等
Curry Howard correspondence and equality
前段时间看到函数类型a -> b
对应关系a ≤ b
,还是a ≥ b
?这对我来说很有意义,因为如果我们在它们之间存在双射(即 (a ≈ b) ≡ (a -> b, b -> a)
),则两种类型是同构的。同样,(a = b) ≡ (a ≤ b) ∧ (a ≥ b)
.
我知道这不是Curry-Howard-Lambek对应关系(即类型论、逻辑和范畴论之间的对应关系)。这是类型理论与其他事物之间的对应关系。我想了解更多有关此通信的信息。有人能给我指出正确的方向吗?
我知道这看起来不像是编程问题,但它与编程有关,我希望一些函数式程序员对此有更多了解,并能为我指明正确的方向。
每一个预购集构成一个类别。设 (S, «)
为预定集合。定义一个类别 C
,其对象是 S
的元素,如果 a « b
则 Hom(a, b)
被 (a, b)
占据,否则无人居住。尽可能地定义构图。类别法则直接来自预序的传递性和自反性。
特别是,格将形成一个包含有限积和副积的范畴。有界格将与初始和最终对象形成一个。
行为足够良好的函数式语言中的类型和函数也形成了一个具有有限积和副积以及初始和最终对象的类别。所以,如果你眯着眼睛看清楚,这些东西就会开始看起来有点相似。
(这是评论而不是答案,但我需要更多 space。)
类型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
通用 eliminator/catamorphism 只是良好的旧归纳原理的类别授权版本。
请注意域点 y
现在是我们类别中的对象(即类型)。此外,函数 f
必须适用于 y
,因此这些不是我们类别中的态射(这将是函数 values :: A -> B
,来自某些类型到某种类型),但对应于类型类别中的函子(将类型映射到类型:: * -> *
)。
前段时间看到函数类型a -> b
对应关系a ≤ b
,还是a ≥ b
?这对我来说很有意义,因为如果我们在它们之间存在双射(即 (a ≈ b) ≡ (a -> b, b -> a)
),则两种类型是同构的。同样,(a = b) ≡ (a ≤ b) ∧ (a ≥ b)
.
我知道这不是Curry-Howard-Lambek对应关系(即类型论、逻辑和范畴论之间的对应关系)。这是类型理论与其他事物之间的对应关系。我想了解更多有关此通信的信息。有人能给我指出正确的方向吗?
我知道这看起来不像是编程问题,但它与编程有关,我希望一些函数式程序员对此有更多了解,并能为我指明正确的方向。
每一个预购集构成一个类别。设 (S, «)
为预定集合。定义一个类别 C
,其对象是 S
的元素,如果 a « b
则 Hom(a, b)
被 (a, b)
占据,否则无人居住。尽可能地定义构图。类别法则直接来自预序的传递性和自反性。
特别是,格将形成一个包含有限积和副积的范畴。有界格将与初始和最终对象形成一个。
行为足够良好的函数式语言中的类型和函数也形成了一个具有有限积和副积以及初始和最终对象的类别。所以,如果你眯着眼睛看清楚,这些东西就会开始看起来有点相似。
(这是评论而不是答案,但我需要更多 space。)
类型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
通用 eliminator/catamorphism 只是良好的旧归纳原理的类别授权版本。
请注意域点 y
现在是我们类别中的对象(即类型)。此外,函数 f
必须适用于 y
,因此这些不是我们类别中的态射(这将是函数 values :: A -> B
,来自某些类型到某种类型),但对应于类型类别中的函子(将类型映射到类型:: * -> *
)。