JavaScript中的单子?
使用Monad的示例JavaScript代码看起来如何?我这样问是因为如果我能看到一个代码示例(JavaScript是一种简单的函数式语言,它可能是学习它的最佳语言),那么理解Monad就更清晰了。我将从用JavaScript编写自己的Monad开始。单子列表是一个很好的起点;我觉得它到目前为止是最有用的。只需定义执行以下操作的函数:JavaScript中的单子?,javascript,functional-programming,theory,monads,Javascript,Functional Programming,Theory,Monads,使用Monad的示例JavaScript代码看起来如何?我这样问是因为如果我能看到一个代码示例(JavaScript是一种简单的函数式语言,它可能是学习它的最佳语言),那么理解Monad就更清晰了。我将从用JavaScript编写自己的Monad开始。单子列表是一个很好的起点;我觉得它到目前为止是最有用的。只需定义执行以下操作的函数: 创建一个给定项目的列表(称之为mreturn) 创建一个空列表(称之为mzero) 将一个列表附加到另一个列表(称之为mplus) 应用一个函数来转换给定列表中的
mreturn
)mzero
)mplus
)map
)join
)mzero
和mplus
构成“加法”部分)。玩一玩,看看仅使用这些函数就可以对列表执行哪些有趣的操作。例如,您可以计算小学生乘法表中所有偶数的列表,如下所示:
var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var even_products = join(map(join(map(nums, function (x) {
return map(nums, function(y) { return x * y })
})),
function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } }
));
或者,将map
和join
组合为一个定义为function bind(l,f){return join(map(l,f))}
的函数bind
可以代替map
和join
使用,并且在Haskell中更常用。同样的练习可以写在上面:
var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var even_products = bind(
bind(nums, function (x) {
return bind(nums, function (y) { return mreturn(x * y) })
}),
function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } }
);
最后,您可能希望将这些函数合并为新的列表原型的一部分(或者现在JavaScript传递给类的任何东西),因此您可以编写jQuery:
var nums = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var even_products = nums
.bind(function (x) { return nums.bind(function (y) { return mreturn(x * y) }) })
.bind(function (x) { if (x % 2 == 0) { return mreturn(x) } else { return mzero() } });
谈谈Monad,它与javascript有什么区别?@Umesh-JQuery在js中几乎是一个Monad。我想,“使用Monad”的代码与其他语言中的代码是一样的。为了更好地理解,我最好研究写单子。还有,谷歌:“MonadsJavaScript”。有一堆文章。