【发布时间】:2011-06-30 19:07:20
【问题描述】:
我正在尝试理解 monads 的概念,我想知道这段代码是否是这个概念的实现(在 JavaScript 中)。
我有函数 M,它返回具有创建包装器方法的 set 方法的新对象
var foo = M().set('getX', function() {
return this.x;
}).set('setX', function(x) {
this.x = x;
}).set('addX', function(x) {
this.x += x;
});
然后我可以链接 foo 的方法
foo.setX(10).addX(20).addX(30).getX()
将返回 60
如果我有带有方法的对象并用这个对象调用 M 也是一样的。
var foo = {
x: 10,
add: function(x) {
this.x += x;
}
};
M(foo).add(10).add(20).add(30).x
将返回 70
函数封装在 M 对象中,因此方法中的 this 上下文始终是那个 M 对象。
f = M({x: 20}).set('getX', function() {
return this.x;
}).set('addX', function(x) {
this.x += x;
}).addX(10).getX
所以 f 是带有 M 包裹的对象上下文的函数——如果我调用 f() 它将返回 30。
我理解正确吗? M 是单子吗?
EDIT修改后的代码在github上https://github.com/jcubic/monadic
【问题讨论】:
-
你不应该向我们展示函数“M”本身吗?
-
据我所知,JavaScript 没有 Monads 作为语言的原生部分。您可能能够模仿它们,但没有像 Haskell 或 LISP 中的 monad 那样“真实”。所以从技术上讲不是。
-
Haskell 在添加单子语法之前已经存在多年。你真正需要的只是高阶函数。
-
此代码 - jcubic.pl/monad.js
-
我读到 jQuery 是 Monad importantshock.wordpress.com/2009/01/18/jquery-is-a-monad 并且在维基百科中有“Monads 允许程序员将动作链接在一起以构建管道,其中每个动作都装饰有由单子。”
标签: javascript functional-programming monads