如何使用Ramda将javascript中的简单平均函数转换为pointfree形式?

时间:2016-09-16 15:46:32

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

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

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

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

3 个答案:

答案 0 :(得分:6)

使用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);

答案 1 :(得分:5)

这是一种方法:

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

答案 2 :(得分:0)

您可以尝试以下

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]));