32

我有点困惑,需要有人来纠正我。让我们概述一下我目前的理解:

内函子在哪里EA是某个类别:

E : A -> A.

既然 Haskell 中的所有类型和态射都在Hask范畴内,那么 Haskell 中的任何函子不也是endofunctor吗?F : Hask -> Hask.

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

4

3 回答 3

37

您可能想澄清您是在询问“Haskell 中的函子”还是Functors. 当在 Haskell 中使用类别理论术语时,并不总是很清楚所假设的类别。

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

如果我们将自己限制为仅将任何类型映射a到具有 kind 的类型构造函数的类型的(f a)那些endofunctors ,那么我们可以将函数的关联映射描述为具有 type 的高阶函数,这当然是称为的类型类.f* -> *(a -> b) -> (f a -> f b)Functor

然而,人们可以很容易地想象在Hask上表现良好的内函子不能(直接)写为 的实例Functor,例如将类型映射a到的函子Either a t。虽然从Hask到某个其他类别的函子显然没有多大意义,但考虑从HaskHask op的(逆变)函子是合理的。

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

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

于 2010-07-17T22:13:25.843 回答
16

即使最终你操纵Hask,也有很多其他类别可以建立在 上Hask,这对于手头的问题可能是有意义的:

  • Hask^op,Hask所有箭头都颠倒了
  • Hask * Hask, 其上的函子是双函子
  • 逗号类别,即。对象是固定对象的a态射,态射是交换三角形
  • 函子范畴,态射是自然变换
  • 代数类别
  • 单曲面类别
  • 克莱斯利类别
  • ...

获取 Mac Lane 的Categories for the Working Mathematician的副本以获得定义,并尝试自己找到他们在 Haskell 中解决的问题。尤其是伴随函子(它们是正确类别中的初始/终止对象)及其与单子的关系。

您会看到,即使有一个大类别(Hask或者“Hask使用正确的箭头/产品/...”,它封装了 Haskell 的语言选择,例如非严格性和惰性),正确派生类别是富有表现力的。

于 2010-07-19T09:07:42.877 回答
7

在论文“Monads need not be endofunctors”中可以找到一个可能相关(或至少有趣)的专门关于 monads 的讨论:

http://www.cs.nott.ac.uk/~txa/publ/Relative_Monads.pdf

于 2010-07-17T22:30:33.843 回答