我有些困惑,需要有人把我弄直。让我们概述一下我目前的理解:

其中E是endofunctor,而A是以下类别:

E : A -> A.

由于Haskell中的所有类型和词素都在Hask类别中,因此Haskell中的函子也不是 endofunctor 吗? F : Hask -> Hask

我有一种很好的感觉,我错了,并且以某种方式简化了这一过程,我希望有人告诉我我是个白痴。谢谢。

最佳答案

您可能想弄清楚是在询问“Haskell中的函子”还是Functor。当在Haskell中使用类别理论术语时,并不总是很清楚假定哪个类别。

但是,是的,默认假设是 Hask ,它被视为具有函数作为态射性的Haskell类型的类别。在这种情况下, Hask 上的endofunctor F将映射任何类型A到类型F(A),将两个类型A和B之间的任何函数f映射到一些函数F(A)和F( B)。

如果然后我们仅将那些将a类型映射到(f a)类型的endofunctors,其中f是类型* -> *的类型构造函数,那么我们可以将函数的关联映射描述为类型为(a -> b) -> (f a -> f b)的高阶函数,即当然,类型类称为Functor

但是,您可以轻松地想象上行为良好的endofunctors,而Hask 不能(直接)作为Functor的实例编写,例如函子将a类型映射到Either a t。尽管从 Hask 到完全其他某个类别的函子显然没有多大意义,但考虑从 Hask Hask op的(变量)函子是合理的。

除此之外,Functor实例必须从整个类别 Hask 映射到它的某些子集,从而也形成一个类别。但是谈论 Hask 的子集之间的函子也是合理的。例如,考虑一个将类型Maybe a发送到[a]的函子。

您可能希望仔细阅读 category-extras package,它提供了一些嵌入了类别理论的结构,嵌入在 Hask 中,而不是全部介绍。

10-06 14:54