当前位置: 首页 > 知识库问答 >
问题:

为什么在Haskell中有co和逆变函子的区别而没有范畴理论?

轩辕翰
2023-03-14

从范畴理论的角度来看,这个答案包括以下陈述:

...事实是co和逆变函子之间没有真正的区别,因为每个函子都是协变函子。

更详细地说,从C类到D类的逆变函子F无非是F型的(协变)函子:COP→D,从C的相反类到D类。

另一方面,Haskell的函数反向变量仅要求分别为实例定义fmapcontramap。这表明,从Haskell的角度来看,存在反变量但不是函式的对象(反之亦然)。

因此,在范畴理论中,似乎“co和逆变函子之间没有真正的区别”,而在Haskell中,逆变函子函子之间有区别。

我怀疑这种差异与Haskell中的所有实现都发生在Hask中有关,但我不确定。

我想我理解范畴理论和哈斯克尔的每一个观点,但我很难找到一个将两者联系起来的直觉。

共有1个答案

车嘉实
2023-03-14

是为了方便。

可以使用更一般的函数类,并为Hask上的内函数(对应于我们现有的函数)和从Hask^op到Hask的函数(对应于我们现有的反向变量)定义实例。但是,这需要一个象征性的认知成本和相当字面的语法成本:然后必须依赖类型推断或类型注释来选择一个实例,并且有显式的转换(在标准库中名为opgetop)进入和离开hask^op。

使用fmapcontramap这两个名称可以减少这两种开销:读者不需要在头脑中运行Hindley-Milner来决定在没有歧义的情况下选择哪个实例,编写者也不需要在歧义的情况下给出显式转换或类型注释来选择实例。

(实际上我在这里稍微重写了一下历史。真正的原因是因为语言设计者认为专门化的函数函数会很有用,而没有想到或者没有看到需要一个更通用的函数函数。后来人们注意到它有时会很有用。但是使用通用化的函数函数类的经验表明,这可能很乏味,出于上述原因,用于最常见情况的专门化类最终出人意料地非常适合。)

 类似资料:
  • 在Haskell中有Hask,其中的对象是Haskell类型,而态性是Haskell函数。但是,type类有一个函数,它在这些类型(因此是对象而不是类别本身)之间进行映射: 和都是HASK中的对象。这是否意味着Haskell中的每个实例都是一个内函数,如果不是,真的表示一个函数吗?

  • 这里也有类似的问题,但它们与特定的编程语言有关,我正在寻找概念层面的答案。 据我所知,functor本质上是不可变的容器,它公开了派生另一个functor的map()API。哪种加法可以将特定的函子称为单子? 据我所知,每个仿函数都是仿函数,但不是每个仿函数都是单子。

  • 我知道Haskell中的许多名字都是受到范畴理论术语的启发,我正试图准确地理解类比的起点和终点。 我已经知道由于一些关于严格/懒惰和的技术细节,不(一定)是一个类别,但现在让我们先把那个放在一边。为了清楚起见, 的对象是具体类型,即kind的类型。这包括像这样的函数类型,但不包括像这样需要类型参数的函数类型。但是,具体类型属于。类型构造函数/多态函数更像是自然转换(或从到自身的其他更一般的映射),

  • 问题内容: 两者都是其类型是所有类型(无人居住)的交集的术语。两者都可以在代码中传递,而不会失败,直到尝试对其进行评估。我能看到的唯一区别是,在Java中,存在一个漏洞,可以对一个操作进行精确的评估,即引用相等比较(),而在Haskell 中,如果不抛出异常就无法进行评估。这是唯一的区别吗? 编辑 我真正想解决的问题是,为什么在Java 中包含如此明显的错误决定,Haskell如何逃避呢?在我看来

  • 现在考虑一个成员类型为的typeclass。例如,可以想象一个类型类,它对应于组的类别(从技术上讲,是的子类别,其对象包含Haskell的所有类型)。概括: 问题2:Haskell中每个成员类型为的typeclass是否都对应于某个类别(从技术上讲:的某个子类别)? 由此可以提出下一个一般性问题: 一般问题:每一个Haskell类型类是否都对应于某种范畴理论的概念? Edit:至少,您可以说,由于

  • 我仔细阅读了关于这个主题的AngularJS文档,然后随意修改了一个指令。小提琴在这里。 下面是一些相关的片段: > 来自HTML: 在窗格指令中: 有几件事我不明白: 为什么必须使用与和与? 是否也可以直接访问父范围,而不使用属性装饰元素? 文档说“通常希望通过表达式将数据从独立作用域传递到父作用域”,但这似乎也适用于双向绑定。为什么表达式路由会更好? 我找到了另一个显示表达式解的fiddle: