【问题标题】:Why define the unit natural transformation for a monad - isn't this implied by the definition of monad being an endofunctor?为什么要为 monad 定义单位自然变换 - 这不是 monad 作为内函子的定义所暗示的吗?
【发布时间】:2011-03-11 06:14:23
【问题描述】:
  1. monad 被定义为类别 C 上的 endofunctor。假设 C 具有类型 int 和 bool 以及其他构造类型作为对象。现在让我们考虑一下在这个类别上定义的列表 monad。

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

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

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

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

【问题讨论】:

    标签: monads monad-transformers


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      嗯,真正令人困惑的是,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) 不叫态射,而是叫映射。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 2012-11-21
        • 1970-01-01
        相关资源
        最近更新 更多