【问题标题】:Are all Haskell functors endofunctors?所有 Haskell 函子都是内函子吗?
【发布时间】:2011-03-17 10:43:30
【问题描述】:

我有点困惑,需要有人帮我弄清楚。让我们概述一下我目前的理解:

其中E 是一个内函子,A 是某个类别:

E : A -> A.

既然 Haskell 中的所有类型和态射都属于 Hask 范畴,那么 Haskell 中的任何 functor 不也是 endofunctor 吗? F : Hask -> Hask.

我有一种很好的感觉,我错了,并且不知何故过于简单化了,我希望有人告诉我我是多么的白痴。谢谢。

【问题讨论】:

  • “Where E...”之前是否缺少某些单词?

标签: haskell functor category-theory


【解决方案1】:

您可能想澄清您是在问“Haskell 中的函子”,还是Functors。当在 Haskell 中使用类别理论术语时,并不总是很清楚所假设的类别。

但是,是的,默认假设是 Hask,它被认为是具有函数作为态射的 Haskell 类型的范畴。在这种情况下,Hask 上的内函子 F 会将任何类型 A 映射到类型 F(A) 并将任何类型 A 和 B 之间的函数 f 映射到函数 F( f) 在某些类型 F(A) 和 F(B) 之间。

如果我们将自己限制为仅将任何类型a 映射到类型(f a) 的那些内函子,其中f 是类型为* -> * 的类型构造函数,那么我们可以将函数的关联映射描述为类型为(a -> b) -> (f a -> f b)的高阶函数,当然也就是叫Functor的类型类。

然而,人们可以很容易地想象 Hask 上表现良好的内函子,它不能(直接)写为 Functor 的实例,例如将类型 a 映射到的函子Either a t。虽然从 Hask 到其他类别的函子显然没有多大意义,但考虑从 HaskHask 的(逆变)函子是合理的强>操作

除此之外,Functor 的实例必然会从整个类别 Hask 映射到它的某个子集,因此也构成一个类别。但是,在 Hask 的子集之间讨论 个函子也是合理的。例如,考虑一个将类型 Maybe a 发送到 [a] 的函子。

您可能希望仔细阅读 category-extras package,它提供了一些嵌入在 Hask 中的受范畴理论启发的结构,而不是假设它的全部。

【讨论】:

  • 这有点切题,但我想检查一下我的理解:从 Maybe a 到 [a] 的映射可以通过多种方式来考虑:(a)函子,其中Maybe 和 [] 构成 Hask 的子类别。 (b) 自然变换,其中 Maybe 和 [] 在 Hask 上形成内函子。 (c) Hask 范畴中的态射族,从 Maybe a 到 [a] forall a 在 Obj(Hask) 中。这一切都正确吗?
  • 附录:(a)和(b)当然取决于分别满足函子定律和自然变换定律的映射。是否公平地说,如果 (a) 满足函子定律,那么可以将相同的映射视为 (b),反之亦然?
  • @Tom:我……是这样想的?这听起来对我来说是正确的。事实上,我认为任何类型为forall a. Maybe a -> [a] 的函数都必须是自然转换。例如,Data.Maybe 中的maybeToList 是(或充分描述)你提到的一切,我相信,但我自己对范畴论的理解相当有限,所以不要把它当作福音......
  • @Jonathan:这将是 Hask 的双重范畴,它与 Hask 具有相同的对象,但所有态射都被反转了。见en.wikipedia.org/wiki/Opposite_category
  • @Jonathan Sterling:@Tom 说了什么。 Haskell 中的一个简单示例是一个函子,它将任何类型 a 映射到类型 (a -> t) (对于某些固定的 t)和任何函数 a -> b 映射到函数 (b -> t) -> (a -> t)。这是标准Functor 映射a(t -> a) 的对偶,用于固定t,更广为人知的是Reader monad。
【解决方案2】:

即使最终你操纵了Hask,还有很多其他类别可以建立在Hask 之上,这对于手头的问题可能很有意义:

  • Hask^op,即Hask,所有箭头都颠倒了
  • Hask * Hask,上面的函子是 bifunctors
  • 逗号类别,即。对象是固定对象a的态射,态射是交换三角形
  • 函子类别、态射是自然变换
  • 代数类别
  • 单一类别
  • Kleisli 类别
  • ...

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

您会看到,即使有一个大类别(Hask,或者可能是“使用右箭头/产品/...从 Hask 提升对象”,它封装了 Haskell 的语言选择,例如非严格性和惰性),适当的派生类别具有表现力。

【讨论】:

  • 非常感谢。我可以看看那本书。
  • 请注意,您必须以目的(函数式编程或代数几何等)阅读本书,因为它对于示例非常简洁,而且您是不知何故需要提供你的。这使它成为一本非常灵活的书,被不同领域的科学家使用。
【解决方案3】:

在论文“Monads need not be endofunctors”中发现了一个可能相关(或至少有趣)的专门关于 monad 的讨论:

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

【讨论】:

  • 对于它的价值,标准类别理论意义上的单子确实被定义为内函子,而 Monad 类型类是一个更狭窄的概念,两者的方式与我为 Functor 描述的方式相同并且由于 Hask 的极具侵入性的笛卡尔封闭结构导致了一些额外的并发症。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
相关资源
最近更新 更多