所有Haskell仿函数都是endofunctors吗?

Jon*_*ing 30 haskell functor category-theory

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

Eendofunctor 在哪里,是一个A类别:

E : A -> A.
Run Code Online (Sandbox Code Playgroud)

由于Haskell中的所有类型和态射都属于该Hask类别,Haskell中的任何函子都不是一个endofunctorF : Hask -> Hask.

我有一种很好的感觉,我错了,并以某种方式过度简化了这一点,我希望有人告诉我,我是一个多么的白痴.谢谢.

C. *_*ann 34

您可能想澄清一下您是否在询问"Haskell中的函子"或Functors.在Haskell中使用类别理论术语时,并不总是清楚假设什么类别.

但是,是的,默认假设是Hask,它被认为是具有函数作为态射的Haskell类型的类别.在这种情况下,在一个endofunctor˚F Hask将任何类型A映射到类型F(A)和任何功能˚F甲两种类型之间和B的函数F(˚F)一些类型之间F(A)和F(B) .

然后如果我们自己限制在只有那些地图的任何类型endofunctors a的类型(f a),其中f是一种构造与实物* -> *的话,我们可以描述的功能相关联的地图为A型高阶函数(a -> b) -> (f a -> f b),这当然是叫类型的类Functor.

然而,人们可以很容易想象上表现良好endofunctors Hask不能被(直接地)写为一个实例Functor,诸如仿函数映射类型aEither a t.虽然从Hask到其他类别的仿函数显然没有多大意义,但考虑从HaskHask op的(逆变)仿函数是合理的.

除此之外,Functor必须从整个类别Hask映射到其某个子集的实例,因此也形成一个类别.但是Hask的子集之间讨论仿函数也是合理的.例如,考虑发送的类型函子Maybe a[a].

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

  • 这有点切线,但我想检查一下我的理解:可以通过多种方式考虑从Maybe a到[a]的映射:(a)一个仿函数,其中Maybe和[]形成子类别哈斯克 (b)自然变换,其中Maybe和[]在Hask上形成endofunctors.(c)Hask类别中的一系列态射,从Obj(Hask)中的Maybe a到[a] forall a.那一切都正确吗? (7认同)
  • @Jonathan Sterling:@Tom说的话.Haskell中的一个简单示例是一个函子,它将任何类型的`a`映射到类型`(a - > t)`用于某些固定的`t`,将任何函数`a - > b`映射到函数`(b - > t) ) - >(a - > t)`.对于固定的`t`,这是标准`Functor`映射`a`到`(t - > a)`的对偶,更好地称为`Reader` monad. (2认同)

Ale*_* C. 14

即使最终你操纵Hask,也可以构建许多其他类别Hask,这对于手头的问题是有意义的:

  • Hask^ op,Hask与所有箭头相反
  • Hask * Hask,它上面的子是bifunctors
  • 逗号类别,即.对象是对固定对象的a态射,态射是交换三角形
  • 函数类别,态射是自然变换
  • 代数类别
  • Monoidal类别
  • Kleisli类别
  • ...

抓住Mac Lane的工作数学家类别的副本来定义,并尝试自己找到他们在Haskell中解决的问题.尤其是伴随仿函数(它们是正确类别中的初始/终端对象)以及它们与monad的关系.

你会看到即使有一个大的类别(Hask或者也许是" Hask使用正确的箭头/产品/ ...... 提升了对象",它封装了Haskell的语言选择,如非严格性和懒惰性),适当派生类别是富有表现力的.

  • 请注意,您必须使用_purpose_(函数式编程或代数几何或其他)阅读本书,因为它对于示例非常简洁,并且您需要提供_yours_.这使得它成为一本非常灵活的书,被非常多样化的科学家所使用. (9认同)

Gia*_*ian 7

关于monad的可能相关(或至少是有趣的)讨论可以在文章"Monads need not be endofunctors"中找到:

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

  • 对于它的价值,标准类别理论意义上的monad确实被定义为endofunctors,而`Monad`类型类是一个更窄的概念,两者都与我为"Functor"描述的方式相同,并且由于**Hask**非常具有侵略性的笛卡尔封闭结构. (2认同)