所有的 Haskell 函子都是自函子吗?

32

我有点困惑,需要有人给我指正一下。让我们概述一下我的当前理解:

其中E是一个自函子,A是某个范畴:

E : A -> A.

既然Haskell中的所有类型和态射都在Hask范畴中,那么在Haskell中任何一个函子不也是一个自函子吗?F:Hask -> Hask。我有一种强烈的感觉我错了,并且以某种方式过于简单化了,希望有人能告诉我我是个白痴。谢谢。


1
在“Where E...”之前是否缺少某个单词? - kennytm
3个回答

37
您可能需要澄清您是否在询问"Haskell中的函子"或Functors。当在Haskell中使用范畴论术语时,不总是清楚正在假定哪个类别。
但是,默认的假设是Hask,它被视为具有函数作为态射的Haskell类型的类别。在这种情况下,对于Hask上的任何类型A,一个自函子F将把其映射到类型F(A),并且对于两个类型A和B之间的任何函数f,它将把其映射到一些类型F(A)和F(B)之间的函数F(f)。
然后,如果我们仅限于那些将任何类型a映射到具有种类* -> *的类型构造函数f的类型,则我们可以将函数的相关映射描述为具有类型(a -> b) -> (f a -> f b)的高阶函数,这当然是称为Functor的类型类。
然而,人们可以轻松地想象出在Hask上表现良好的自函子,这些自函子不能(直接)写成Functor的实例,例如将类型a映射到Either a t的函子。虽然从Hask到完全不同的另一个类别的函子显然没有多少意义,但考虑从HaskHaskop的(反变)函子是合理的。
除此之外,Functor 的实例必然从整个范畴 Hask 映射到其中的某个子集,因此也形成了一个范畴。但是谈论在 Hask 的子集之间的函子也是合理的。例如,考虑将类型 Maybe a 发送到 [a] 的函子。
您可能希望浏览 category-extras,它提供了一些类别论启发的结构,嵌入到 Hask 中,而不是假设整个 Hask

8
这有点跑题,但我想要确认我的理解:从Maybe a到[a]的映射可以有多种方式来思考: (a)一个函子,其中Maybe和[]形成Hask的子范畴。 (b)一个自然变换,其中Maybe和[]在Hask上形成了恒等函子。 (c)一族态射,在范畴Hask中从Maybe a到[a] forall a in Obj(Hask) 。这全部正确吗? - Tom Crockett
附录:(a)和(b)当然取决于映射分别满足函子和自然变换的法则。可以说,如果函子法则对于(a)得到满足,那么同样的映射也可以看作是(b),反之亦然,这种说法是否公平? - Tom Crockett
@Tom:我觉得是吧?这个听起来对我来说是正确的。事实上,我认为具有类型 forall a. Maybe a -> [a] 的任何函数 必须 是自然变换。例如,Data.Maybe 中的 maybeToList 或足以描述你提到的所有内容,但是我的范畴论理解相当有限,所以不要把它当作圣经一样... - C. A. McCann
1
@Jonathan:那将是Hask的双重类别,它具有与Hask相同的对象,但所有态射都被反转。请参见http://en.wikipedia.org/wiki/Opposite_category。 - Tom Crockett
2
@Jonathan Sterling:同意 @Tom 的观点。在 Haskell 中,一个简单的例子是一个函子将任何类型 a 映射到类型 (a -> t),其中 t 是一个固定的类型,并将任何函数 a -> b 映射为函数 (b -> t) -> (a -> t)。这是标准的 Functor 的对偶映射,它将 a 映射到 (t -> a)(其中 t 为固定类型),更为人熟知的是 Reader 单子。 - C. A. McCann

16
即使最终您会操纵Hask,还有很多其他类别可以建立在Hask之上,这些类别对于手头的问题可能是有意义的:
  • Hask^op,它是具有所有箭头反转的Hask
  • Hask * Hask,其上的函子是双函子
  • 逗号范畴,即对象是到固定对象a的态射,态射是可交换三角形
  • 函子范畴,态射是自然变换
  • 代数范畴
  • 单调范畴
  • Kleisli 范畴
  • ...

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

您将看到,即使有一个大类别(Hask,或者可能是“从Hask提升了正确的箭头/乘积的对象”,它封装了 Haskell 的语言选择,如非严格性和惰性计算),适当的派生类别也是有表达力的。


非常感谢。我可能会查看那本书。 - Jonathan Sterling
9
请注意,阅读本书时必须有一个“目的”(如函数式编程、代数几何或其他),因为它在示例方面非常简洁,而你需要提供自己的示例。尽管如此,这使得本书非常灵活,适用于非常多元化背景的科学家们。 - Alexandre C.

7

2
就此而言,标准范畴论意义下的单子确实被定义为自函子,而 Monad 类型类则是一个更狭窄的概念,与我描述 Functor 相同的方式,但由于 Hask 的非常侵入性笛卡尔闭结构而导致了一些额外的复杂性。 - C. A. McCann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接