首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript中的Monads?

JavaScript中的Monads?
EN

Stack Overflow用户
提问于 2011-12-28 20:55:55
回答 1查看 3.1K关注 0票数 11

使用Monad的示例JavaScript代码会是什么样子?我之所以问这个问题,是因为如果我能看到一个代码示例,那么对Monad的理解就会清晰得多(而JavaScript是一种简单的函数式语言,它可能是学习它的最佳语言)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-28 23:06:12

我会从用JavaScript编写您自己的monad开始。list monad是一个很好的起点;我发现到目前为止它是最有用的。只需定义执行以下操作的函数:

创建一个给定项目的列表(将此列表称为空列表(将此列表称为一个列表到另一个列表(将此mplus).

  • Apply称为将给定列表中的每个元素转换为简单列表的函数(将此map).

  • "Flatten“称为列表列表,通过将列表连接为简单列表(称为join).

这定义了所谓的“加性单体”(mzeromplus构成了“加性”部分)。试试看,只使用这些函数对列表进行操作就可以做一些有趣的事情。例如,您可以计算学生乘法表上所有偶数的列表,如下所示:

代码语言:javascript
复制
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() } }
));

或者,将mapjoin组合在一起,作为定义为function bind(l, f) { return join(map(l, f)) }的单个函数。bind可以用来代替mapjoin,并且更常用在例如Haskell中。然后可以编写上面的相同练习:

代码语言:javascript
复制
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-esque:

代码语言:javascript
复制
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() } });
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8656172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档