为什么要定义monad的单位自然变换 - monad作为endofunctor的定义是不是暗示了这一点?

时间:2011-03-11 06:14:23

标签: monads monad-transformers

  1. monad被定义为类别C上的endofunctor。假设C,类型为int,bool和其他构造类型为对象。现在让我们考虑一下这个类别中定义的monad列表。
  2. 通过它的定义列表然后是一个endofunctor,它将一个int类型映射(可以解释为一个函数吗?)到List [int]和bool到List [bool]并映射(再一个函数?)a morphism int - >布尔到 List [int] - >列表[BOOL]

    所以,到目前为止,这有点道理。但令我陷入深深困惑的是需要伴随它的自然变换的额外定义: 一个。 Unit ...将int转换为List [int](List functor的定义是否已经暗示了这个?这是我有一个主要的困惑

    湾是否总是必须将List仿函数理解为从int到List [int]的映射,而不是从int到List [bool]的映射?

    ℃。 List [int]中的单元自然转换int是不同于从int到List [int]的映射,将List定义为functor是隐含的吗?我想这只是我先前问题的重新陈述。

2 个答案:

答案 0 :(得分:2)

单位是从C上的Identity functor到List的自然转换;通常,自然变换a:F =>两个平行函子F之间的G,G:X - > Y由

组成
  1. 对于每个对象x:域的X,态射a_x:Fx - > GX
  2. 加上关于态射的F和G的行为的自然条件
  3. 你应该考虑如上所述的自然变换作为从F到“G”的方式。将其应用于你的单位列表情况,单位为每个类型X指定一个函数Unit_X:X - >列出[X],这只是用一个元素查看你的类型的实例作为List [X]实例。

    我不明白你在b上究竟在问什么。但就c而言。他们是完全不同的东西。定义中没有从int到List [int]的映射;定义给出的是,对于每个地图f:X - > Y,地图列表(f):列表[X] - >列表[Y]; Unit给你的是一种方式,可以将任何类型的X视为某些特定类型的X列表,即具有一个元素的列表。

    希望它有所帮助;从您使用的List []表示法中,也许您来自Scala / Java背景,如果是这种情况,您可能会发现Scala中的类别理论介绍有趣:http://www.weiglewilczek.com/blog/?p=2760

答案 1 :(得分:0)

嗯,令人困惑的是,Cat A和Cat B之间的仿函数F被定义为:

映射:

  1. F映射A到F(A)---它是否意味着新的List()?或者为什么不呢?
  2. 和F映射F(f):F(A) - > F(B)
  3. 这就是我在书中定义这些内容的方式。上面的点#1(F映射A到F(A)) - 读取像我的态度,将A转换成F(A)。如果是这种情况,为什么我们需要单位自然变换,从A到F(A)?

    非常奇怪的是,仿函数定义使用了单词map(但不使用单词morphism)。我看到A到F(A)不是一个态射,而是一个地图。