javascript - 为什么 JavaScript 上的 for 循环比模式匹配更糟糕?

标签 javascript functional-programming pattern-matching

我需要在工作中在数组中创建很多实体,有人对我说使用 this library to use "pattern matching"在我的拉取请求中,而不是手动创建数组并填充它。

我们必须创造很多东西,例如。用户:

function createUser(id){
  return {
    id: id
  }
}

var users = createStuff(createUser, 50);

我做了什么来填充:

function createStuff(createFunction, howManyTimes){
  var createdStuffs = [];
  for(var i = 0; i < howManyTimes; i++){
    createdStuffs.push(createFunction(i));
  }

  return createdStuffs;
}

他要求我用模式匹配做什么:

function createStuff(createFunction, howManyTimes){
  return howManyTimes.matches(
    (x = 0) => [],
    (x)     => [createFunction(x)].concat(createStuff(createFunction, x - 1))
  )
}

这种模式匹配有什么好处?我确实理解他的示例中的递归调用,它取代了 for 循环,但我认为我的示例更容易阅读,尽管所有创建逻辑基本上都是在他的示例中写在一行中。

我正在询问对此的解释,大多数人告诉我“它更好,因为功能齐全并且移动部件更少”,这是真的吗?我不同意他的观点,我需要解释或论证来证明他是错的

最佳答案

您的同事采取了非常正确的前提,即不变性和函数式风格是有益的,并得出了一个非常错误的结论,即任何采用函数式风格的不可变解决方案都是优越的。可读性在任何范式中并且都很重要。

使用 underscore.js 的正确功能解决方案具有所有好处,而且不会出现任何令人眼花缭乱的可读性问题:

var users = _.map(_.range(howManyTimes), createUser);

关于javascript - 为什么 JavaScript 上的 for 循环比模式匹配更糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39278240/

相关文章:

javascript - 将 HTML 表的 <tbody> 元素指定为 Marionette for Backbone.js 中的区域

javascript - 从 HTML 输入中获取 INPUT 值

javascript - 是否有一种无点的方法通过比较元组的元素从列表中过滤掉元组?

haskell - 不在范围 : readMaybe, 我应该导入哪个库?

string - KMP 前缀表直觉

javascript - 在多个 GridView /表上使用相同的函数

javascript - 从样式化组件宏重新导出样式化不起作用

functional-programming - Racket - Closure/Currying,区别在哪里?

Haskell:Num 类型的模式匹配

java - 使用正则表达式从源代码中提取消息