Haskell中的函子如何与类别理论中的函子相关?

就我所知,函子是两类之间的映射,例如从C http://mathurl.com/32qch9w.png中的对象到D http://mathurl.com/36b8r37.png中的对象,其中C http://mathurl.com/32qch9w.png和D http://mathurl.com/36b8r37.png是类别。

在Haskell中有Hask ,其中对象是Haskell类型,态射是Haskell函数。 然而, Functor类型类有一个函数fmap ,它映射这些类型(因此它们是对象而不是类别本身):

fmap :: (a -> b) -> f a -> f b

fafb都是Hask中的对象。 这是否意味着每个实例的Functor在Haskell是endofunctor,如果不是不Functor真正代表一个仿函数?

我在这里错过了什么? Haskell中的类型是否也是类?


Functor一个实例指定了两件事:类型* -> *的类型构造函数F ,即从Hask对象到Hask对象的映射,以及类型(a -> b) -> (F a -> F b) ,也就是从Hask的箭头到与对象映射F兼容的Hask的箭头的映射。 所以,是的, Functor所有实例都是endofunctors。 Hackage有几种常用的方法,例如Control.Categorical.Functor。


是的,所有Functor实例都是Hask上的endofunctors - 事实上,所有Hask中的endofunctors都有一个适当的子类别,其中的对象是通过应用特定类型构造函数获得的类型。 该类型的构造函数是Functor实例的关联对象,并给出了对象的映射; 态射映射是fmap ,它(因为我们只关心笛卡尔封闭范畴上的endofunctors)本身就是Hask中的一个态射系列

除了那些可以有Functor实例的functor,比如反转函子(从Hask到它的相反类),考虑其他functor是有意义的。 Arrow类中的arr函数也对应于一个函子,从Hask的所有类别到其对象与Hask相同的类别,并且它们的态射由Arrow实例所关联的类型构造函数描述。

进一步的概括也是可能的(正如丹尼尔瓦格纳所说),但是使用起来往往会变得越来越尴尬。


关于这一点的一个重要观点是,你真正想要的是在Hask中 丰富的函子,而不仅仅是简单的旧函子。 哈斯克是笛卡尔式封闭的(不是真的,但它很努力成为单件),所以它本身就是自然丰富的。

现在,丰富endofunctors给你限制这些语言中可实现的方式:一个丰富的函子Hask - > Hask为对象(类型)的水平的函数fa和每个对象对a, bHask态射去f: Hask (a,b) - > Hask (fa,fb)。 当然,这只是fmap :: (a -> b) -> fa -> fb

链接地址: http://www.djcxy.com/p/43309.html

上一篇: How are functors in Haskell related to functors in category theory?

下一篇: Why are WMI Queries so slow sometimes?