gpt4 book ai didi

haskell - Haskell 中的所有 Monad 实例是否只是从 Hask 映射到 Hask 的不同方式?

转载 作者:行者123 更新时间:2023-12-02 11:02:50 24 4
gpt4 key购买 nike

我正在阅读Haskell/Category theory这是 definition of monad摘自那篇文章:

A monad is a special type of functor, from a category to that samecategory, that supports some additional structure. So, down todefinitions. A monad is a functor M:C->C, along with twomorphisms for every object X in C:

unit: X -> M(X)

join: M(M(X)) -> M(X)

据我了解,在Haskell中return相当于unit。但是通过 return 我可以写:

x :: [Int]  -- x is a member of Lst category
x = return 5

这是 Haskell 中的有效代码。现在,如您所见,这里的 5 不是 Lst 的成员,但 return 适用于它。

所以,我猜 Lst 不是来自 M:C->CС。但那是谁呢?

也许正确的答案是Hask,但我不确定“从类别到其子类别的仿函数”与“仿函数来自一个类别到同一类别”。

最佳答案

这是一个常见的混淆点,您已经足够清楚地提出了问题,因此可以回答。

I'm not sure that "functor from category to it's subcategory" is the same as "functor from category to the same category".

这不一样。仿函数由四部分数据组成:源类别 C、目标类别 D、C 的对象到 D 的对象的映射、以及满足某些条件的 C 的态射到 D 的态射的映射。如果你改变 D,那么你就改变了仿函数。

然而,当我们定义仿函数时,我们经常在类别 D 中进行一些选择。我从你的问题推断出 LstHask 的子类别,其对象是类型形式为 [a],尽管我不确定 Lst 的态射应该是什么。我们可以定义这两种形状之一的仿函数[]:

  1. [] : Hask -> Lst (即 [] 的目标类别是Lst)

  2. [] : Hask -> Hask (即 [] 的目标类别是Hask)

这些在技术上是不同的仿函数,我们必须做出选择。在这种情况下,正确的选择是选择 2。我们需要源类别和目标类别相同,因为我们需要将 [] 应用于 [] 的输出,在加入中。所以 C = HaskM = []

一般来说,考虑像 Lst 这样被定义为某种类型构造函数的图像的类别很少有用。我不确定这个(非常常见)的想法从何而来。我建议你放弃“类别Lst”的想法。目前只有一个类别就足够了!

打个比方,考虑对实数 f(x) = x^2 进行平方的函数。我们可以将其视为从实数到实数的函数 f : R -> R,即使碰巧 f(x) 只取非负实数值。 f 的目标不必等于 f 的图像(f 在其输入值上实际获得的值)。

关于haskell - Haskell 中的所有 Monad 实例是否只是从 Hask 映射到 Hask 的不同方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41612919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com