OCaml中monad的用途是什么?

dor*_*mon 15 monads ocaml

这可能是一个愚蠢的问题,但由于OCaml不纯,内置副作用,OCaml中monad的用途是什么?

Jam*_*ins 24

Monads与纯度无关,只是没有Monads的纯语言几乎完全没用.

用外行人的话来说,Monad只是一组描述如何执行一系列步骤的规则.拥有Monad抽象使您能够定义用于执行内容的DSL.可以构建Monad以智能地处理诸如异常,ATOMIC回滚/提交,重试逻辑,在每个步骤之间休眠等事情.

以下是Monads的一些示例:

https://wiki.haskell.org/Monad#Interesting_monads

我意识到这个列表是针对Haskell的,这是一种纯语言,但不要让你感到困惑.

与普遍的看法相反,你不需要理解类别理论来理解Monad是什么.monad基本上有两件事:(从这篇维基百科文章中解释)

  1. 单位函数,定义为(a - > M a),在Haskell中称为"return",用于将值放入Monad的上下文中.

  2. 一个绑定操作,定义为(M t - >(t - > M u) - > M u),看起来很可怕但如果仔细观察,这是一个在进程的每一步之间调用的函数,这是你注入了好东西.

根据语言的不同,可能会有更多的东西,但这是它的核心.

  • @Sheeft在某些时候你需要副作用,如果只是为了得到你的计算结果.一种不能做到这一点的语言不是一种"编程语言",而是一种正式的符号. (8认同)
  • Haskell的IO子系统的第一个版本也不使用monad。有一个非常笨拙的版本具有“ main :: [RequestResult]-> [Request]”(大致而言),并且严重依赖于惰性,但是您也可以对普通的代数数据类型使用基于连续的方法。它最终看起来与monadic IO非常相似,但是导致泛化性和可重用性较低的代码,因此最终被monads取代。 (2认同)

Leo*_*ite 6

虽然OCaml支持大多数语言提供的标准副作用,但这并不包括所有可能的副作用.OCaml没有提供本机支持的许多效果.其中许多效果可以使用Monads进行编码.例如,

  • 并发(参见Lwt和Async库)
  • 非确定性选择
  • 一流的延续
  • 矛盾的选择和回溯

使用更复杂的计算表示,例如参数化单子,可以编码甚至更奇特的效果.例如,

  • 多态
  • 线性资源