Mik*_*cki 13 haskell currying category-theory arity
在我真正问到它之前,这个问题有一个很长的前奏:)
假设类型A和B代表类别,然后是函数
f :: B - > A.
是两个类别之间的态射.我们可以创建一个新的类别,其中A和B为对象,f为箭头,如下所示:

现在,让我们介绍一个新的类别C和函数g:
g :: C - > B - > A.
我希望能够在上面的类别中添加C和g,但我不确定如何做到这一点.直观地说,我想要一些看起来像这样的东西:

但我以前从未在类别图中看到类似的东西.为了使这个犹太人,我可以引入一个虚拟箭头g'并构建一个像这样的2类:

但这似乎是一幅钝画.(当然,我们可以使用我上面提到的图片作为正确的图片的速记.)此外,它不再完全清楚g和g'甚至是什么.g不再是一个函数,它将类别C作为输入并返回一个态射:: B - > A.相反,
g'::(C - > C)
g ::(C - > C) - >(B - > A)
如果我们传递g身份,那么一切都会正常.但是,如果我们通过其他一些功能,那么谁知道会发生什么?
所以我的问题是:n类中的n-arrow真的是我们应该考虑arity n函数的方式吗?或者是否有一些更简单的方法将此功能表示为我错过的标准类别?
C. *_*ann 12
在这里谈论"类别之间的态射"听起来像是一个可能的类别错误(ha,ha).在Haskell中,我们经常谈论一个所谓的类别Hask,它是类别的一些不一致的理想化(0)版本,其对象是类型的类型,*而态射是函数.目前还不清楚类别之间的"功能"是什么,如果它们不是Hask的态射.
另一方面,在更一般的设置中,您当然可以定义一个类别,其对象是其他类别(1),具有您想要的任何态射,以满足必要的属性.通常的例子是Cat,小类别的类别,其态射是仿函数.
也就是说,在任何一种情况下,你的问题的答案基本相同.谈论两个对象之间的态射集合,好像该集合本身就是一个对象 - 即,作为其他态射的源或目的地 - 你需要一个对象来填充该角色,并且某种方式间接谈论态射,以便你可以来回翻译.
一种方法,如果我们已经有办法将对象作为单个对象(通常称为某种"产品")进行讨论,那么就是定义态射A collectionB→C的集合之间的等价性.态量A→C B的集合,它允许物体C B代表态量B→C的集合.
如果所讨论的"对象对"实际上是一个分类产品,我们有一个笛卡尔闭合类别,Hask和Cat都是.在Haskell中,上述等价是函数curry和uncurry(2).
当然,这不是谈论态射作为对象的唯一方式.一般概念简称为"封闭类别".但是,如果您正在考虑高阶函数和函数式编程,那么笛卡尔闭合类别可能就是您的想法.
(0)这通常涉及假装⊥不存在(所有函数都是完全的)和处理产生相同输出的函数(例如,忽略性能差异).
(1)但是不要试图谈论一个对象都属于所有类别的类别,否则Bertrand Russell会给你这个业务.
(2)当然是以逻辑学家Haskell Curry命名.
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |