monad只是endofunctors类别中的幺半群,问题是什么?
谁首先说了以下几点?
monad只是一个幺半群
endofunctors的类别,是什么
问题?
在一个不太重要的注意事项上,这是真的,如果是这样,你能给出一个解释(希望有一个可以被没有Haskell经验的人理解的解释)吗?
没有找到相关结果
已邀请:
4 个回复
坛沤疲撑拆
s,因为它们主要只处理一个类别;类型类别 - 但我离题了)。但你可以想象另一个类别是“X上的endofunctors”类别。这是一个类别,其中对象是endofunctors,而态射是自然变换。 在那些终结者中,其中一些可能是单子。哪些是monad?正是那些在特定意义上是幺半群的。而不是拼写出从monad到monoids的确切映射(因为Mac Lane确实比我希望的要好得多),我只是将它们各自的定义并排放在一起让你比较: 幺半群是...... 一套,S 操作,•:S×S→S S的元素,e:1→S ......满足这些法律: (a•b)•c = a•(b•c),对于S中的所有a,b和c e•a = a•e = a,对于S中的所有a monad是...... 一个endofunctor,T:X→X(在Haskell中,类型构造函数为
,带有
实例) 自然变换,μ:T×T→T,其中×表示仿函数组成(μ在Haskell中称为
) 一个自然变换,η:I→T,其中我是X上的身份endofunctor(η在Haskell中被称为
) ......满足这些法律: μ∘Tμ=μ∘μT μ∘Tη=μ∘ηT= 1(身份自然变换) 稍微眯着眼睛,你可能会发现这两个定义都是同一个抽象概念的实例。
容淑阔九
窃誓额
其中,
是唯一对下面绝对必要的。我曾经写过
的解释,有些人似乎觉得有用,所以我会参考。 引用Tom Crockett的优秀答案,我们有: monad是...... 一个endofunctor,T:X - > X. 自然变换,μ:T×T - > T,其中×表示仿函数组成 一个自然变换,η:I - > T,其中我是X上的标识endofunctor ......满足这些法律: μ(μ(T×T)×T))=μ(T×μ(T×T)) μ(η(T))= T =μ(T(η)) 我们如何将其转换为Haskell代码?那么,让我们从自然转型的概念开始:
形式
的类型类似于函数类型,但不是将其视为两种类型(种类
)之间的函数,而是将其视为两个仿函数(每种仿函数
)之间的态射。例子:
基本上,在Haskell中,自然变换是从某种类型
到另一种类型
的函数,使得
类型变量对于调用者来说是“不可访问的”。因此,例如,
不能成为自然变换,因为它“挑剔”我们可以为ѭ17实例化哪些类型。我经常使用的一种直观方式是: 仿函数是一种在不触及结构的情况下对某些内容进行操作的方法。 自然变换是一种操作某事物结构的方式,而不会触及或查看内容。 现在,让我们解决这个定义的条款。 第一个子句是“endofunctor,T:X - > X”。好吧,Haskell中的每个
都是人们称之为“Hask类别”的endofunctor,其对象是Haskell类型(种类
),其态射是Haskell函数。这听起来像一个复杂的陈述,但它实际上是一个非常微不足道的陈述。所有这一切意味着,
为你提供了为任何
构造类型
和任何
中的函数
的方法,并且这些符合算子法则。 第二个子句:Haskell中的
仿函数(随平台一起提供,所以你只需要导入它)就是这样定义的:
所以汤姆克罗克特定义的自然变换η:I - > T可以用这种方式写成任何
实例
:
第三个条款:Haskell中两个仿函数的组合可以通过这种方式定义(它也随平台一起提供):
因此Tom Crockett定义的自然变换μ:T×T - > T可以这样写:
这是endofunctors类别中的monoid的说法意味着
(仅部分应用于其前两个参数)是关联的,并且
是其标识元素。即,以下同构持有:
这些很容易证明,因为
和
都被定义为
,而Haskell报告将
的语义定义为被定义的类型与
的数据构造函数的参数类型之间的同构。例如,让我们证明
:
席酱