所有 Haskell 函子都是内函子吗?
-
17-09-2020 - |
题
我有点困惑,需要有人来纠正我。让我们概述一下我目前的理解:
在哪里 E
是一个内函子,并且 A
是某个类别:
E : A -> A.
由于 Haskell 中的所有类型和态射都在 Hask
类别,不是任何 函子 在 Haskell 中还有一个 内函子? F : Hask -> Hask
.
我有一种强烈的感觉,我错了,并且在某种程度上过于简单化了,我希望有人告诉我我是一个多么白痴的人。谢谢。
解决方案
您可能想澄清您是否在询问“Haskell 中的函子”,或者 Functor
s。在 Haskell 中使用范畴论术语时,并不总是清楚假设的范畴是什么。
但是,默认的假设是 哈斯克, ,它被视为具有态射函数的 Haskell 类型的范畴。在这种情况下,内函子 F 上 哈斯克 会将任何类型 A 映射到类型 F(A) 和任何函数 F 两种类型 A 和 B 之间的函数 F(F) 介于某些类型 F(A) 和 F(B) 之间。
如果我们将自己限制为仅映射任何类型的内函子 a
到一个类型 (f a)
在哪里 f
是一个带有 kind 的类型构造函数 * -> *
, ,那么我们可以将函数的关联映射描述为具有类型的高阶函数 (a -> b) -> (f a -> f b)
, ,这当然是称为的类型类 Functor
.
然而,人们可以很容易地想象出行为良好的内函子 哈斯克 不能(直接)写为实例 Functor
, ,例如映射类型的函子 a
到 Either a t
. 。虽然函子显然没有多大意义 哈斯克 完全到其他类别,考虑一个(逆变)函子是合理的 哈斯克 到 哈斯克操作.
除此之外,实例 Functor
必须从整个类别映射 哈斯克 到它的某个子集,因此也形成了一个类别。但谈论函子也是有道理的 之间 的子集 哈斯克. 。例如,考虑一个发送类型的函子 Maybe a
到 [a]
.
您可能希望仔细阅读 category-extras
包裹, ,它提供了一些嵌入在范畴论启发的结构 哈斯克 而不是假设它的全部。
其他提示
即使最终你操纵了 Hask
, ,还有很多其他类别可以构建 Hask
, ,这对于当前的问题可能有意义:
Hask
^op,即Hask
所有箭头都反转Hask * Hask
, ,其上的函子是 双函子- 逗号类别,即。对象是固定对象的态射
a
, 态射是交换三角形 - 函子类别、态射是 自然转变
- 代数类别
- 幺半群类别
- 克莱斯利类别
- ...
拿一份 Mac Lane 的副本 职业数学家的类别 有定义,并尝试自己找到它们在 Haskell 中解决的问题。尤其是伴随函子(它们是正确类别中的初始/终止对象)及其与单子的关系。
你会发现即使有一个大类别(Hask
, ,或者也许“从 Hask
使用正确的箭头/产品/...”,它封装了 Haskell 的语言选择,例如非严格性和惰性),正确的派生类别具有表现力。
在论文“Monads need not be endofunctors”中可以找到专门关于 monad 的可能相关(或至少有趣)的讨论: