Monad不是一个语法糖吗?

Ank*_*kur 16 f# haskell functional-programming

我经历过各种论文/文章/博客,而不是莫纳德.人们在各种背景下谈论它们,比如类别理论(世界上是什么?)等.经过所有这些并试图真正理解和编写monadic代码之后,我开始认识到monad只是语法糖(可能是最多的)所有人都得到了荣耀.无论是Haskell中的符号还是F#中的Computation Expressions,甚至LINQ都选择了许多运算符(记住LINQ语法也是C#/ VB中的语法糖).

我的问题是,如果有人认为monad不仅仅是语法糖(通过嵌套方法调用),那么请用"实用性"而不是"理论概念"来启发我.

谢谢大家.

更新:

在经历了所有答案之后,我得出的结论是,在特定语言中monad概念的实现是通过语法糖驱动的,但monad概念本身与句法糖无关,是非常一般或抽象的概念.感谢每个机构的答案,使概念本身与其在语言中实现的方式之间有所区别.

Nic*_*son 22

Monad不是语法糖; Haskell有一些糖用于处理monad,但你可以在没有糖和操作员的情况下使用它们.因此,Haskell并不像其他语言那样真正"支持"monad,只是让它们更易于使用和实现.monad不是编程结构,也不是语言特征; 它是一种思考某些类型对象的抽象方式,当它被直接作为Haskell类型时,它提供了一种很好的方式来思考类型中的状态转移,这使得Haskell(或者实际上任何语言,当被认为是功能上的)做它的事情时.


sep*_*p2k 14

do符号,计算表达式和类似的语言结构当然是语法糖.这很明显,因为这些结构通常根据它们的去除来定义.monad只是一种支持某些操作的类型.在Haskell中Monad是一个类型类,它定义了那些操作.

所以回答你的问题:Monad不是语法糖,它是一个类型类,但是do符号是语法糖(当然完全是可选的 - 你可以使用monads就好了没有do符号).


scl*_*clv 12

根据定义,Monads不是语法糖.它们是遵循少数法则的一系列值(列表,集合,选项类型,有状态函数,延续等)的操作(返回/单元,映射和连接)的三倍.在编程中使用时,这些操作表示为函数.在某些情况下,例如Haskell,通过使用类型类,可以在所有monad上多态地表达这些函数.在其他情况下,必须为每个monad为这些函数指定不同的名称或命名空间.在某些情况下,例如Haskell,有一层语法糖可以使这些函数的编程更加透明.

所以Monads不是关于嵌套函数调用本身,当然也不是关于他们的糖.它们涉及三个函数本身,它们运行的​​值的类型以及这些函数遵守的规律.


Log*_*ldo 5

Monads是语法糖,就像类和方法调用语法是语法糖一样.如果有点冗长,将面向对象的原则应用于诸如C之类的语言是有用且实用的.就像OO(以及许多其他语言特性)monad是一个想法,一种思考组织程序的方式.

Monadic代码可以让你编写代码的形状,同时将某些决定推迟到以后.Log monad(可以是Writer的变体)可用于为支持日志记录的库编写代码,但让消费应用程序决定日志记录的位置(如果有的话).您可以在没有语法糖的情况下执行此操作,或者如果您正在使用的语言支持它,您可以利用它.

当然还有其他方法可以获得这个功能,但这只是一个,希望是"实用"的例子.