gpt4 book ai didi

haskell - 为什么 Haskell 中的 co 和逆变仿函数有区别,但范畴论没有区别?

转载 作者:行者123 更新时间:2023-12-04 09:17:15 24 4
gpt4 key购买 nike

This answer from a Category Theory perspective包括以下声明:

...the truth is that there's no real distinction between co and contravariant functor, because every functor is just a covariant functor.

...

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.



另一方面,Haskell 的 Functor Contravariant 只需要 fmapcontramap ,分别为实例定义。这表明,从 Haskell 的角度来看,存在 Contravariant 的对象。但不是 Functor s(反之亦然)。

因此,似乎在范畴论中“co 和逆变仿函数之间没有真正的区别”,而在 Haskell 中, Contravariant 之间存在区别。和 Functor .

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

我想我自己理解类别理论和 Haskell 的每一个观点,但我正在努力寻找一种将两者联系起来的直觉。

最佳答案

是为了方便。

可以使用 more general Functor 类,并为 Hask 上的 endofunctors 定义实例(对应于我们现有的 Functor )和从 Hask^op 到 Hask 的仿函数(对应于我们现有的 Contravariant )。但这会带来象征性的认知成本和相当字面意义上的句法成本:然后必须依靠类型推断或类型注释来选择实例,并且有显式转换(在标准库中名为 OpgetOp)到并在 Hask^op 之外。

使用名称 fmapcontramap放宽了这两种成本:读者不需要在头脑中运行 Hindley-Milner 来决定当哪个实例明确时被选择,并且作者不需要给出明确的转换或类型注释来选择一个实例在它不明确的情况下.

(我实际上是在稍微改写历史。真正的原因是语言设计者认为专门的 Functor 会很有用,并且没有想到或认为不需要更通用的 Functor。人们来了后来发现它有时会很有用。但是使用泛化 Functor 类的经验表明,这可能很乏味,而且对于最常见的情况,专门的类毕竟非常适合,原因已描述以上。)

关于haskell - 为什么 Haskell 中的 co 和逆变仿函数有区别,但范畴论没有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com