术语"monad"是否适用于Maybe或List等类型的值,或者它是否仅适用于类型本身?

Lau*_*ves 15 monads terminology

我注意到"monad"这个词似乎以一种不一致的方式使用.我开始相信这是因为很多(如果不是大多数)monad教程是由那些刚刚开始自己​​构建monad的人写的(例如:核废料太空服卷饼),因此术语结束得到一些过载/损坏.

特别是,我想知道术语"monad"是否可以应用于Maybe,List或IO等类型的单个值,或者术语"monad"是否真的只应用于类型本身.

这是一个微妙的区别,所以也许类比可能会更清楚.在数学中,我们有,环,字段,组等.这些术语适用于整个值集以及可以对它们执行的操作,而不是单个元素.例如,整数(以及加法,否定和乘法的运算)形成一个环.你可以说"整数是一个戒指",但你永远不会说"5是一个戒指".

所以,你能说" Just 5是一个单子",还是会说"5是一个戒指"?我不知道类别理论,但我的印象是说" Maybe是一个单子"而不是" Just 5是一个单子" 真的是有道理的.

Con*_*nal 19

"Monad"(和"Functor")在描述价值时被普遍滥用.没有值是monad,functor,monoid,applicative functor等.只有类型和类型构造函数(更高级的类型)才可以.当你听到(并且你会)"列表是幺半群"或"函数是monad"等,或者"这个函数以monad为参数"时,不要相信它.问问演讲者"考虑到Haskells类对类型(包括高阶类)而不是值进行分类,任何值都是monoid(或monad或......)怎么样?" 列表不是幺半群(等).List a是.

我的猜测是,这种流行的滥用源于具有价值类而非类型类的主流语言,因此习惯性,无意识的价值阶级思维潜入其中.

为什么我们精确地使用语言是否重要?因为我们用语言思考,并且通过语言建立和传达理解.因此,为了有清晰的想法,有助于拥有清晰的语言(或能够在任何时候).

"我们语言的邋is让我们更容易有愚蠢的想法.关键是这个过程是可逆的." - 乔治奥威尔,政治与英语

编辑:这些评论适用于Haskell,而不是类别理论的更一般设置.

  • 更精确的是,存在*monoid/monad /以List作为其载体,因为在同一载波上通常存在许多这样的代数结构. (2认同)

Ale*_* C. 11

List是一个monad,List a是一个类型,[]是一个List a(类型的元素).

从技术上讲,monad是一个具有额外结构的仿函数 ; 在Haskell中,我们只使用Haskell类型的函子到它自己.

因此,特别是一个"函数",它接受一种类型并返回另一种类型(它具有种类* -> *).

List,State s,Maybe,等有单子.State不是单子,因为它有种类* -> * -> *.

(除此之外:为了混淆事情,Monads只是仿函数,如果我给自己一个部分有序的集合A,那么它形成一个类别,如果一个<= b和Hom(一个Hom(a,b)= {1元素} ,b)=否则为空.现在任何增加函数f:A - > A形成一个仿函数,monad是那些满足x <= f(x)和f(f(x))<= f(x)的函数,因此f(f(x))= f(x) - 这里的monad在技术上是"A - > A的元素."另请参见闭包运算符.)

(除了2:因为你似乎知道一些数学,我鼓励你阅读类别理论.你会看到代数结构可以看作是由monad引起的.请参阅Dan Piponi出色的博客中的这篇优秀博客文章为预告片.)

  • @LaurenceGonsalves:`州s`是一个monad.`State`有种`* - >* - >*`. (2认同)