JavaScript中的单子
Monads in JavaScript?
本文关键字:JavaScript 更新时间:2023-09-26
如何使用Monad的示例JavaScript代码?我之所以这样问,是因为如果我能看到一个代码示例,那么理解Monad就会清晰得多(JavaScript是一种简单的函数式语言,它可能是学习Monad的最佳语言)。
我将从用JavaScript编写自己的单子开始。列表单子是一个很好的开始;我觉得它是迄今为止最有用的。只需定义做以下事情的函数:
- 创建一个给定项目的列表(称为
mreturn
)。 - 创建一个空列表(称为
mzero
)。 - 将一个列表附加到另一个列表(称为
mplus
)。 - 应用一个函数来转换给定列表中的每个元素(称为
map
)。 - 通过连接列表将列表列表"Flatten"成一个简单列表(称为
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() } });
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Javascript:selenium Web驱动程序isDisplayed()不工作
- 如何通过ajax刷新JSF填充的javascript变量
- 如何在Javascript中将JSon对象转换为数组
- Javascript生成的表单未提交
- 使用javascript将动态表从一个html页面打印到另一个html页
- 通过javascript重定向html传递php变量