【发布时间】:2019-05-20 03:49:18
【问题描述】:
This answer from a Category Theory perspective 包含以下语句:
...事实上,co 和逆变函子之间没有真正的区别,因为每个函子都只是一个协变函子。
...
更详细地说,从 C 类到 D 类的逆变函子 F 只不过是 F : Cop→D 类型的(协变)函子,从 C 的相反类别到D类。
另一方面,Haskell 的Functor 和Contravariant 只需要分别为实例定义fmap 和contramap。这表明,从 Haskell 的角度来看,存在 Contravariant 但不是 Functors 的对象(反之亦然)。
所以似乎在范畴论中“co 和逆变函子之间没有真正的区别”,而在 Haskell 中,Contravariant 和 Functor 之间存在区别。
我怀疑这种差异与 Haskell 中发生在 Hask 中的所有实现有关,但我不确定。
我认为我自己理解类别理论和 Haskell 的每一个观点,但我很难找到一种将两者联系起来的直觉。
【问题讨论】:
-
我已经很久没有学习范畴论了(无论如何,它从来都不是我专门研究的领域),但我认为可以肯定地说协变和协变之间“没有区别”是不正确的逆变函子。只是一个可以用另一个来定义,所以用数学术语来说差异是微不足道的。 (这并不是说它在应用到其他数学领域时不会产生重要的影响。)现在我对 Haskell 比较陌生,不熟悉逆变类,但我想它忠实地再现了数学定义.
-
所以想多了,
Functor和Contravariant在 Haskell 中不是“相同”的原因可能只是因为 Hask 的相反类别(其中一个来自 @ 的态射987654334@ 到b由b -> a类型的函数表示)并不是一件特别自然的事情。这是因为 Haskell 实际上只涉及 一个 类别,函子是 Hask 上的内函子,而数学类别理论是关于各种不同类别的关系(即函子之间)在他们自己的权利)。 -
如果没有逆变函子的概念,您也可以轻松过关,因为任何这样的函子都只是给定适当源类别的协变函子。不过,定义
Contravariant类型类比定义 HaskellOP 更容易。
标签: haskell terminology functor category-theory