我有点困惑,需要有人来纠正我。让我们概述一下我目前的理解:
内函子在哪里E
,A
是某个类别:
E : A -> A.
既然 Haskell 中的所有类型和态射都在Hask
范畴内,那么 Haskell 中的任何函子不也是endofunctor吗?F : Hask -> Hask
.
我有一种很好的感觉,我错了,并且以某种方式过度简化了这一点,我希望有人告诉我我是多么的白痴。谢谢。
我有点困惑,需要有人来纠正我。让我们概述一下我目前的理解:
内函子在哪里E
,A
是某个类别:
E : A -> A.
既然 Haskell 中的所有类型和态射都在Hask
范畴内,那么 Haskell 中的任何函子不也是endofunctor吗?F : Hask -> Hask
.
我有一种很好的感觉,我错了,并且以某种方式过度简化了这一点,我希望有人告诉我我是多么的白痴。谢谢。
您可能想澄清您是在询问“Haskell 中的函子”还是Functor
s. 当在 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到某个其他类别的函子显然没有多大意义,但考虑从Hask到Hask op的(逆变)函子是合理的。
除此之外,实例Functor
必须从整个Hask类别映射到它的某个子集,因此也形成了一个类别。但是在Hask的子集之间讨论函子也是合理的。例如,考虑一个将类型发送到.Maybe a
[a]
您可能希望仔细阅读该category-extras
包,它提供了一些嵌入在Hask中的类别理论启发的结构,而不是假设它的全部。
即使最终你操纵Hask
,也有很多其他类别可以建立在 上Hask
,这对于手头的问题可能是有意义的:
Hask
^op,Hask
所有箭头都颠倒了Hask * Hask
, 其上的函子是双函子a
态射,态射是交换三角形获取 Mac Lane 的Categories for the Working Mathematician的副本以获得定义,并尝试自己找到他们在 Haskell 中解决的问题。尤其是伴随函子(它们是正确类别中的初始/终止对象)及其与单子的关系。
您会看到,即使有一个大类别(Hask
或者“Hask
使用正确的箭头/产品/...”,它封装了 Haskell 的语言选择,例如非严格性和惰性),正确派生类别是富有表现力的。
在论文“Monads need not be endofunctors”中可以找到一个可能相关(或至少有趣)的专门关于 monads 的讨论: