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
fa
和fb
都是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, b
在Hask态射去f: Hask (a,b) - > Hask (fa,fb)。 当然,这只是fmap :: (a -> b) -> fa -> fb
上一篇: How are functors in Haskell related to functors in category theory?