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

在哪里 E 是一个内函子,并且 A 是某个类别:

E : A -> A.

由于 Haskell 中的所有类型和态射都在 Hask 类别,不是任何 函子 在 Haskell 中还有一个 内函子? F : Hask -> Hask.

我有一种强烈的感觉,我错了,并且在某种程度上过于简单化了,我希望有人告诉我我是一个多么白痴的人。谢谢。

有帮助吗?

解决方案

您可能想澄清您是否在询问“Haskell 中的函子”,或者 Functors。在 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, ,例如映射类型的函子 aEither 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 的可能相关(或至少有趣)的讨论:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top