【问题标题】:javascript fold reduce functional programmingjavascript折叠减少函数式编程
【发布时间】:2018-12-03 05:53:07
【问题描述】:

在 Javascript 中有一个 reduce 函数,它接受函数和数组,映射数组并返回函数返回的任何内容。

例如:

[1, 2, 3].reduce(function(acc, x) {
  acc += x 
  return acc;
}, 0); // 6 

在 Haskell 中,折叠对我来说也是如此:

foldl (+) 0 [1,2,3]  -> 6

如果我想将这种函数创建为库,将其称为 fold 而不是 reduce 是否安全,两者之间有什么区别。

除了名称之外,这两个功能是否相同或存在一些差异

我用不同的语言进行演示,因为 Js 没有 foldl 功能。

谢谢

【问题讨论】:

    标签: functional-programming


    【解决方案1】:

    命名不一致,取决于语言。

    在 Kotlin 等某些上下文中,reduce 不采用初始值,但 fold 采用。在 Haskell 中,有foldlfoldl1 来区分这两种。在 Clojure 中,相同的函数 reduce 具有不同的重载来获取初始值或不获取初始值。

    它们基本上描述了相同的概念,我从未发现这两个名称之间有任何明显的区别。

    【讨论】:

    • 小说明:如果折叠可以用递归替换,为什么它存在 - 我建议只使用更简单的语法和更短的代码?
    • @user2693928 缩减是对常见递归模式的概括。你使用reduce,所以你不需要直接使用递归。
    • 是的,但是在 Haskell 中没有 for 循环 - 它们被递归替换。为什么 reduce 也没有像 for 循环那样被递归替换
    • @user2693928 抱歉,我不确定你在问什么。您是否在问为什么在具有 for 循环的语言中不使用 for 循环实现 reduce?
    • 我想知道为什么在 Haskell 中他们添加了折叠,因为每个折叠操作都可以通过递归来完成。就像他们没有在 Haskell 中放置 for 循环一样,为什么要添加折叠。例如列表的总和可以用递归来实现。
    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 2012-02-21
    • 2011-12-05
    • 1970-01-01
    • 2019-06-06
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多