Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的单子?_Javascript_Functional Programming_Theory_Monads - Fatal编程技术网

JavaScript中的单子?

JavaScript中的单子?,javascript,functional-programming,theory,monads,Javascript,Functional Programming,Theory,Monads,使用Monad的示例JavaScript代码看起来如何?我这样问是因为如果我能看到一个代码示例(JavaScript是一种简单的函数式语言,它可能是学习它的最佳语言),那么理解Monad就更清晰了。我将从用JavaScript编写自己的Monad开始。单子列表是一个很好的起点;我觉得它到目前为止是最有用的。只需定义执行以下操作的函数: 创建一个给定项目的列表(称之为mreturn) 创建一个空列表(称之为mzero) 将一个列表附加到另一个列表(称之为mplus) 应用一个函数来转换给定列表中的

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

我将从用JavaScript编写自己的Monad开始。单子列表是一个很好的起点;我觉得它到目前为止是最有用的。只需定义执行以下操作的函数:

  • 创建一个给定项目的列表(称之为
    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”。有一堆文章。