Functor
的一个实例需要指定两个东西:一个类型构造器 F
,其 kind 为 * -> *
,也就是从 Hask 类中的对象映射到 Hask 类中的对象;以及一个函数,其类型为 (a -> b) -> (F a -> F b)
,也就是将 Hask 类中的箭头映射到与对象映射 F
兼容的 Hask 类中的箭头。因此,是的,Functor
的所有实例都是 endofunctors。Hackage 中提供了一些常规扩展,例如Control.Categorical.Functor。Functor
实例都是在Hask上的自函子——事实上,所有从Hask到特定类别子集的自函子的对象类型都通过应用特定类型构造函数而得到。该类型构造函数与Functor
实例相关联,并给出了对象的映射;对于态射的映射是fmap
,它本身(因为我们只关心笛卡尔闭范畴上的自函子)是Hask中的一族态射。Functor
实例之外的其他函子确实是有意义的,例如逆变函子(从Hask到它的对偶范畴)。在Arrow
类中的arr
函数也对应一个函子,从全部Hask映射到只有与Hask相同的对象类型的范畴,并且其态射由Arrow
实例所关联的类型构造函数描述。f a
,并且对于每一对对象a, b
,在Hask中有一个从f : Hask(a,b) -> Hask(fa,fb)的态射。当然,这只是fmap :: (a -> b) -> f a -> f b
。
F
的类型。 - Daniel Wagner* -> *
的情况下工作,我的意思是函子可以将函数Int -> Char
映射到函数String -> Double
。据我所知,在理论上,函子适用于任何态射。但我想这并不太实际。或者我完全错了吗? - dimsuzInt -> Char
映射到String -> Double
。也就是说,将a -> b
映射到c -> d
。或者这是不可能的吗?我知道函子将a -> b
映射到F a -> F b
,但是否有可能有一种函子,在另一端不使用类型构造器进行映射?再次强调,我指的至少是在理论上。 - dimsuz