这个答案是从范畴论的角度来看的 https://math.stackexchange.com/a/661989/72174包括以下语句:
...事实是,协函子和逆变函子之间没有真正的区别,因为每个函子只是一个协变函子。
...
More in details a contravariant functor F from a category C to a category D is nothing more than a (covariant) functor of type F : Cop→D, from the opposite category of C to the category D.
另一方面,哈斯克尔的Functor https://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor.html and Contravariant https://hackage.haskell.org/package/contravariant-1.5/docs/Data-Functor-Contravariant.html只是要求fmap
and contramap
,分别为实例定义。这表明,从 Haskell 的角度来看,存在以下对象:Contravariant
但不是Functor
s(反之亦然)。
因此,在范畴论中,“协函子和逆变函子之间没有真正的区别”,而在 Haskell 中,协函子和逆变函子之间存在区别。Contravariant
and Functor
.
我怀疑这种差异与 Haskell 中发生的所有实现有关,但我不确定。
我想我自己理解范畴论和 Haskell 观点,但我正在努力寻找连接两者的直觉。
是为了方便。
一个人可以通过更一般Functor http://hackage.haskell.org/package/categories-1.0.7/docs/Control-Categorical-Functor.html类,并在 Hask 上定义 endofunctor 的实例(对应于我们现有的Functor
)以及从 Hask^op 到 Hask 的函子(对应于我们现有的Contravariant
)。但这是以比喻的认知成本和相当字面的语法成本为代价的:然后必须依靠类型推断或类型注释来选择实例,并且存在显式转换(称为Op
and getOp
在标准库中)进出 Hask^op。
使用名称fmap
and contramap
减轻了这两种成本:读者不需要在头脑中运行 Hindley-Milner 来决定在明确的情况下选择哪个实例,并且编写者不需要给出显式转换或类型注释来在实例不明确的情况下选择实例。
(实际上我在这里重写了一点历史。real原因是因为语言设计者认为专门的Functor
会很有用,但没有想象或没有看到需要更通用的Functor
。后来人们发现它有时会很有用。但经验一般Functor
类表明这可能很乏味,而且由于上述原因,最常见情况的专门类毕竟非常适合。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)