我有点困惑,需要有人给我指正一下。让我们概述一下我的当前理解:
其中E
是一个自函子,A
是某个范畴:
E : A -> A.
既然Haskell中的所有类型和态射都在Hask范畴中,那么在Haskell中任何一个函子不也是一个自函子吗?F:Hask -> Hask
。我有一种强烈的感觉我错了,并且以某种方式过于简单化了,希望有人能告诉我我是个白痴。谢谢。
我有点困惑,需要有人给我指正一下。让我们概述一下我的当前理解:
其中E
是一个自函子,A
是某个范畴:
E : A -> A.
既然Haskell中的所有类型和态射都在Hask范畴中,那么在Haskell中任何一个函子不也是一个自函子吗?F:Hask -> Hask
。我有一种强烈的感觉我错了,并且以某种方式过于简单化了,希望有人能告诉我我是个白痴。谢谢。
Functor
s。当在Haskell中使用范畴论术语时,不总是清楚正在假定哪个类别。a
映射到具有种类* -> *
的类型构造函数f
的类型,则我们可以将函数的相关映射描述为具有类型(a -> b) -> (f a -> f b)
的高阶函数,这当然是称为Functor
的类型类。Functor
的实例,例如将类型a
映射到Either a t
的函子。虽然从Hask到完全不同的另一个类别的函子显然没有多少意义,但考虑从Hask到Haskop的(反变)函子是合理的。Functor
的实例必然从整个范畴 Hask 映射到其中的某个子集,因此也形成了一个范畴。但是谈论在 Hask 的子集之间的函子也是合理的。例如,考虑将类型 Maybe a
发送到 [a]
的函子。category-extras
包,它提供了一些类别论启发的结构,嵌入到 Hask 中,而不是假设整个 Hask。forall a. Maybe a -> [a]
的任何函数 必须 是自然变换。例如,Data.Maybe 中的 maybeToList
或足以描述你提到的所有内容,但是我的范畴论理解相当有限,所以不要把它当作圣经一样... - C. A. McCanna
映射到类型 (a -> t)
,其中 t
是一个固定的类型,并将任何函数 a -> b
映射为函数 (b -> t) -> (a -> t)
。这是标准的 Functor
的对偶映射,它将 a
映射到 (t -> a)
(其中 t
为固定类型),更为人熟知的是 Reader
单子。 - C. A. McCannHask
,还有很多其他类别可以建立在Hask
之上,这些类别对于手头的问题可能是有意义的:
Hask
^op,它是具有所有箭头反转的Hask
Hask * Hask
,其上的函子是双函子a
的态射,态射是可交换三角形获取 Mac Lane 的 Categories for the Working Mathematician 以获得定义,并尝试自己找出它们在 Haskell 中解决的问题。特别是关注伴随函子(它们是正确范畴中的初始/终止对象)及其与单子的关系。
您将看到,即使有一个大类别(Hask
,或者可能是“从Hask
提升了正确的箭头/乘积的对象”,它封装了 Haskell 的语言选择,如非严格性和惰性计算),适当的派生类别也是有表达力的。
关于单子(monads)的讨论,可能会有一些相关(或者至少是有趣的)内容可以在文章“单子不必是自函子”的链接中找到:
Monad
类型类则是一个更狭窄的概念,与我描述 Functor
相同的方式,但由于 Hask 的非常侵入性笛卡尔闭结构而导致了一些额外的复杂性。 - C. A. McCann
E
...”之前是否缺少某个单词? - kennytm