澄清:这个问题不是关于解释monad,而是在这个上下文中“计算模型”这个术语的含义,以及这与monad的关系。请参见这个答案末尾对这个短语的典型用法的解释。
在我的理解中,图灵机、递归函数理论、lambda演算等都是计算模型,我无法看出monad如何与它们相关(如果有)。
单子作为计算模型的概念可以追溯到Eugenio Moggi的工作。在Haskell从业者中,Moggi在此问题上最知名的论文是Notions of computations as monads (1991)。相关引用包括:
[lambda]演算被认为是研究编程语言的有用数学工具,因为程序可以与[lambda]项进行识别。但是,如果进一步使用[beta][eta]-转换来证明程序的等价性,则会引入严重的简化(将程序与从值到值的总函数进行识别),这可能危及理论结果的适用性。在本文中,我们介绍了基于范畴语义的演算,为证明各种计算概念下的程序等价性提供了正确的基础。我们不以[beta][eta]-转换理论为证明程序等价性的起点,它将类型为A -> B的程序(过程)的表示与从A到B的总函数进行识别,因为这种识别完全抹去了例如非终止、非确定性和副作用等真实程序可能展现出的行为。相反,我们按照以下方式进行:这个特定的术语在《计算作为单子的概念》中被删除,因为Moggi将他的演示焦点放在了“替代描述”上(即Kleisli三元组,由类型构造器、返回和绑定组成,在Haskell中称为)。然而,本质始终保持不变。一个计算模型是一个单子(T;[eta];[mu]),满足单要求:对于每个属于C的A,[eta-A]都是单调的。
有一个单子的另一种描述方法(见[7]),更容易从计算角度进行证明。[...] [第2页]
菲利普·沃德勒在函数式编程的单子(1992)一书中更注重实际应用方面来阐述这个想法:
介绍了使用单子来构建函数式程序的方法。单子提供了一个方便的框架,用于模拟其他语言中发现的效果,例如全局状态、异常处理、输出或非确定性。[第1页]没有意义。这只是某人为了将单子(monads)转化为已知事物而努力寻找比喻的产物。它基本上有意义。例如,“可以构建形成单子的计算模型”是一个有意义的陈述。但差别很大。“单子是计算模型”试图将广泛的抽象强制解释为狭窄的解释,而另一种则指定你可以针对一个使用案例使用更广泛的抽象。
对简化解释要非常谨慎。如果熟悉的术语可以传达相同的含义,那么整个开发人员社区为什么还要继续使用不熟悉的术语?在追求改进的过程中,这个术语Monad
在语言社区中已经流行了20年。唯一可能发生的情况是它传达了有用和精确的信息。
只是很难编写一篇解释如何将这个想法应用于编程的文章,让那些不了解语言中使用的结构的人感到有意义。如果你对至少高阶类型、类型类和高阶函数不熟悉,那么你无法理解符号表达的含义。
学习先决条件的想法是有帮助的。练习编写代码也是有帮助的。查看如何使 (>>=)
在不同的具体类型中工作也是有帮助的。艰苦地学习如何使用像Parsec这样的库(或现代后代像megaparsec)也是有帮助的。
试图通过隐喻将想法强制与自己已知的某些东西相匹配是无用的。
在编程中,"模型"(model)指的是一种执行计算的方式,能够表达任何算法。因此,图灵机、λ演算、邮递员问题等都属于"模型"的范畴。而"Church-Turing论题"(Church–Turing thesis)则是指出了任何可计算函数均可用图灵机计算出来的理论。