5
  1. monad 被定义为类别 C 上的 endofunctor。假设 C 具有类型 int 和 bool 以及其他构造类型作为对象。现在让我们考虑在这个类别上定义的列表单子。

根据它的定义 list then 是一个内函子,它映射(这可以解释为一个函数吗?)一个 int 类型到 List[int] 和 bool 到 List[bool] 和映射(又是一个函数?)一个态射 int - > bool to List[int] -> List[bool]

所以,到目前为止,这是有道理的。但是让我深感困惑的是需要伴随它的自然变换的附加定义:Unit...将 int 转换为 List[int] (List 函子的定义不是已经暗示了这一点吗?这是我遇到的一个主要困惑

湾。List 函子是否总是必须被理解为从 int 到 List[int] 而不是从 int 到 List[bool] 的映射?

C。单位自然转换 int 到 List[int] 是否不同于将 List 定义为函子所暗示的从 int 到 List[int] 的映射?我想这只是对我之前问题的重新陈述。

4

2 回答 2

3

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

  1. 对于域的每个对象 x: X,一个态射 a_x : Fx -> Gx
  2. 加上一个与 F 和 G 对态射的作用相关的自然条件

您应该将上述自然转换视为从 F 到 G 的一种“前进”方式。将其应用于您的单元以用于 List 情况,Unit 为每个类型 X 指定一个函数 Unit_X : X -> List[X],并且这个只是将您的类型的实例视为具有一个元素的 List[X] 实例。

我不明白你在 b 上到底在问什么。但关于c。它们是完全不同的东西。定义中没有隐含从 int 到 List[int] 的映射;定义给你的是,对于每个地图 f: X -> Y,地图 List(f) : List[X] -> List[Y]; Unit 给你的是一种将任何类型的 X 视为某种特定类型的 X 列表的方法,这些列表具有一个元素。

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

于 2011-03-11T23:02:40.540 回答
0

好吧,真正令人困惑的是,Cat A 和 Cat B 之间的函子 F 被定义为:

映射:

  1. F 将 A 映射到 F(A) --- 这是否意味着 new List()?或者为什么不呢?
  2. 和 F 映射 F(f) : F(A) -> F(B)

这就是我如何看待书中定义的那些。上面的第 1 点(F 将 A 映射到 F(A))- 在我看来,这就像将 A 转换为 F(A) 的态射。如果是这样,为什么我们需要单位自然变换,从 A 到 F(A)?

非常奇怪的是,函子定义使用了词映射(但没有使用词态射)。我看到 A 到 F(A) 不称为态射,而是称为映射。

于 2012-02-15T02:03:47.937 回答