为什么JavaScript的承诺(Promises)在技术上不是Monad
在编程世界中,Monad的概念一直以来都是非常流行的。众多编程语言都有自己的Monad实现,并且被广泛应用于各种编程范式中。然而,有人非议起了JavaScript的承诺(Promises)是否真的符合Monad的标准。本文将揭示这个问题的答案,以及为什么我们不应该将JavaScript的承诺视为Monad。
在我们深入探讨之前,让我们先了解一下Monad的定义。Monad是一种数学概念,最初由数学家和计算机科学家们引入到编程领域中。它被定义为一种可组合的计算单元,具有特定的运算规则。
在编程语言中,Monad通常有三个重要的特征:unit函数、bind函数和三个法则(左恒等性、右恒等性和结合律)。这些特征共同构成了Monad的基本定义。
然而,JavaScript的承诺(Promises)并不完全符合Monad的定义。尽管JavaScript的承诺具有类似的功能,但它们缺少一些重要的特性,使得它们不能被视为真正的Monad。
其中一个重要的特征是Monad的结合律。结合律指的是,对于任意的Monad a、b和c,通过bind函数进行组合时,无论是先绑定a再绑定b,还是先绑定b再绑定c,最终的结果都应该相同。然而,JavaScript的承诺在结合性上并不满足这一要求。
此外,JavaScript的承诺也缺乏unit函数的概念。Unit函数是Monad的一个基本特征,它允许将普通的值转化为Monad值。然而,JavaScript的承诺并没有提供这样的功能,导致其与Monad的定义相去甚远。
为了更好地理解这些问题,我们可以参考[1]中的一篇文章,其中指出了JavaScript的承诺与Monad的不同之处。尽管JavaScript的承诺具有一些类似的特性,但它们不完全满足Monad的定义,并且存在一些与Monad相悖的行为。
总的来说,虽然JavaScript的承诺(Promises)在编程世界中扮演着重要的角色,并且在处理异步操作时非常有用,但从技术角度来看,它们并不是真正的Monad。我们应该理解JavaScript的承诺的独特性,并意识到它们与Monad的区别。
参考文献:
[1] “Promises aren’t Monads”, available at: https://rybicki.io/blog/2023/12/23/promises-arent-monads.html
了解更多有趣的事情:https://blog.ds3783.com/