【问题标题】:How to convert simple average function in javascript to pointfree form using Ramda?如何使用 Ramda 将 javascript 中的简单平均函数转换为无点形式?
【发布时间】:2017-01-24 22:03:22
【问题描述】:

如何将以下简单的average 函数转换为无点形式(使用 Ramda)?

var _average = function(xs) {
  return R.reduce(R.add, 0, xs) / xs.length;
};

我已经有一段时间了,但是 R.divide 函数让我失望,因为分子和分母需要先评估

【问题讨论】:

  • 感谢您提出关于可读性的重要观点。记住 “如果无点风格不容易编写,它可能也不容易阅读。” 但作为一个练习,你将如何回答如果您不得不这样做。
  • 我真的不知道,看起来很头疼。 :)

标签: javascript functional-programming currying pointfree ramda.js


【解决方案1】:

使用R.converge:

//    average :: Array Number -> Number
const average = R.converge(R.divide, [R.sum, R.length]);

使用R.lift(比R.converge更普遍适用的功能):

//    average :: Array Number -> Number
const average = R.lift(R.divide)(R.sum, R.length);

【讨论】:

  • 那些更干净,甚至可以理解。即使在我看来,它们也毫无意义。不错的工作。 :) 我很惊讶 R.average 这样的东西还不存在?但越看越有趣。
  • 哦,是的,有一种 R.mean,最简单,更清洁的方法。 @Xotic750:投票赞成。
【解决方案2】:

你可以试试下面这个

var _sum = function(xs) {
  return R.reduce(R.add, 0, xs);
};

var _average = function(xs) {
  return R.divide(_sum(xs), xs.length);
};

console.log(_average([3,4,5,6]));

或者干脆

var _average = function(xs) {
  return R.divide(R.reduce(R.add, 0, xs), xs.length);
};

console.log(_average([3,4,5,6]));

【讨论】:

  • 这些在我头上的痛苦要小得多。我假设他们符合 OP 的要求,因为我对 pointfree 不是很熟悉?
  • 你的_sum 函数最好写成R.reduce(R.add, 0)——不需要包装函数。此外,您可以简单地使用R.sum。 ;)
  • 非常感谢 davidchambers 的反馈。只有在看到 OP 的帖子后,我才听说 Ramda 库和无点功能。只是试图抓住一些关于那些快速回答这篇文章的想法并有所收获。我的回答基于我的快速理解。只是为了帮助OP。其次,看了 MinusFour 的帖子,明白了一些,看了你的帖子,我觉得我现在对 Ramda 库和无点函数有了更好的理解。我确实尝试过 R.sum,但没有编辑帖子。 :)。无论如何,再次感谢您的反馈。投票赞成,
【解决方案3】:

这是一种方法:

let xs = [5, 5];
let average = R.compose(R.apply(R.divide), R.juxt([R.sum, R.length]));
console.log(average(xs));
<script src="//cdn.jsdelivr.net/ramda/latest/ramda.min.js"></script>

基本上,R.juxt 将数组值映射到 R.sumR.length,这会为您提供一个数组,其中包含数组的总和和数组的长度。结果应用于R.divide

【讨论】:

  • 这就是pointfree 也被称为pointless 的原因吗?只是开玩笑,但这对我来说确实很痛苦。 :)
  • 我花了一段时间才弄明白,但我认为这还不错。我只是不习惯。中缀符号也没有多大帮助。
  • 投了赞成票。我觉得这是完美的无点解决方案。我提供的解决方案是基于 OP 写的。
  • 使用R.converge/R.lift 更简洁,因为它不需要R.applyR.compose。看我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 2018-11-12
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多