在范畴论中,一个函子是指两个范畴之间的映射,即将范畴 A 中的每个对象映射到另一个范畴 B 中的对象,并将每个态射 C -> D 映射到 B 中的相应对象,同时保持态射的组合。因此,可以说函子由两个“部分”组成,一个将对象映射到对象,另一个将态射映射到态射。
在 Haskell 中,如果我理解正确的话,在 Functor 类型中的每个类型都可以被“映射”,即类型为 a -> b 的函数可以被映射到函数 F a -> F b 中。那么为什么不存在一个
在 Haskell 中,如果我理解正确的话,在 Functor 类型中的每个类型都可以被“映射”,即类型为 a -> b 的函数可以被映射到函数 F a -> F b 中。那么为什么不存在一个
return :: Functor f => a -> f a
函数,特别是针对 Functor?是因为没有必要吗,因为我们可以简单地利用 Monad 实例中的 return 定义,因为 return 实际上只对一个 Monad 的函子部分起作用,还是有其他原因呢?
这让我感到奇怪,因为如果是这样的话,为什么return
不包含在Functor
实例中呢?我的意思是每个单子都有一个函子部分,所以对我来说,那是有道理的。有人能在这方面给我启示吗?
a
都有return::a->F a
。例如,在集合范畴中,定义F a = emptySet
(并且F anyMorphism = identity_emptySet
)可以构造一个函子,但是对于非空的a
,不存在a -> F a
。 - chidata.pointed
中有一个Pointed
类型类,其中包含point :: a -> p a
。但并非每个函子都可以成为Pointed
的实例,例如data Void a deriving Functor
(基本上是由@chi给出的原因)。 - sigfpeFunctor f
实例的结构由f
确定。f
本身是对象映射(映射Type -> Type
),而fmap @f
是箭头映射(将a -> a'
映射到f a -> f a'
)。这些是两种映射方式,其中对象映射确定了箭头映射。 - Iceland_jack