JavaScript中的Monads?

Tow*_*wer 11 javascript theory monads functional-programming

示例JavaScript代码如何使用Monad?我问,因为如果我能看到代码示例(而JavaScript是一种简单的函数式语言,它可能是用来学习它的最佳语言),那么理解Monad会更加清晰.

Chr*_*ejo 18

我首先要用JavaScript编写自己的monad.列表monad是一个很好的起点; 到目前为止我发现它最有用.只需定义执行以下操作的功能:

  1. 创建一个给定项目的列表(调用此方法mreturn).
  2. 创建一个空列表(调用此方法mzero).
  3. 将一个列表附加到另一个列表(调用此方法mplus).
  4. 应用函数来转换给定列表中的每个元素(调用此方法map).
  5. 通过连接列表将一个列表列表"扁平"成一个简单的列表(调用它join).

这定义了所谓的"添加剂单子"(mzeromplus形成"添加剂"部分).只需使用这些功能在列表上操作,就可以看看你可以做些什么有趣的事情.例如,您可以在schoolkid的乘法表上计算所有偶数的列表,如下所示:

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() } }
));
Run Code Online (Sandbox Code Playgroud)

可替代地,结合mapjoin一起作为定义为单个功能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() } }
);
Run Code Online (Sandbox Code Playgroud)

最后,您可能希望将这些函数作为新列表原型的一部分(或者现在为类传递的任何JavaScript),因此您可以编写jQuery-esque:

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() } });
Run Code Online (Sandbox Code Playgroud)