这可能是一个愚蠢的问题,但由于OCaml不纯净且内置副作用,OCaml中monad的用途是什么?
答案 0 :(得分:23)
Monads与纯度无关,只是没有Monads的纯语言几乎完全没用。
在外行人的术语中,Monad只是一组描述如何执行一系列步骤的规则。拥有Monad抽象使您能够定义用于执行内容的DSL。 Monad可以构建为智能处理异常,ATOMIC回滚/提交,重试逻辑,在每个步骤之间休眠等等。
以下是Monads的一些例子:
https://wiki.haskell.org/Monad#Interesting_monads
我意识到这个列表适用于Haskell,这是一种纯语言,但不要让你感到困惑。
你不需要理解类别理论来理解Monad是什么,与普遍看法相反。 monad基本上有两件事:(从this wikipedia article转述)
单位函数,定义为(a - > M a),称为" return"在Haskell中,用于将值放入Monad的上下文中。
绑定操作,定义为(M t - >(t - > M u) - > M u),看起来很可怕但是如果仔细观察,这是一个在两者之间调用的函数这个过程的每一步,都是你注入好东西的地方。
根据语言的不同,可能会有更多的东西,但这是它的核心。
答案 1 :(得分:5)
虽然OCaml支持大多数语言提供的标准副作用,但这并不包括所有可能的副作用。 OCaml没有提供本机支持的许多效果。其中许多效果可以使用Monads进行编码。例如,
使用更复杂的计算表示,例如参数化单子,可以编码更奇特的效果。例如,
答案 2 :(得分:3)
虽然OCaml允许编写命令式代码,但它本质上仍然是功能性的,它被功能程序员使用。我们希望尽可能使用持久性数据结构和算法。
关于你的问题,特别是monad对于异步计算是有用的,例如,Lwt
,Async
,它们用于绑定计算(而不是通常的设置方式)回调)。此外,monad用于错误处理,而不是异常。另外,monad在编写解析器方面非常有用,请参阅mparser
库。还有其他用途,我只列举了最受欢迎的用途。
通常monad只允许您在简单的顺序语法下隐藏复杂的控制流。
答案 3 :(得分:1)
这可能比你想要的答案更天真,但monad只是一个简单的抽象,对构造计算很有用。这是一个像数学关系一样的数学问题(或者对于比我更聪明的人,比如一个群体)。一旦你了解它们是什么,你就会在任何地方看到它们,它们有助于组织你的思考。