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

Cha*_*had 3 javascript functional-programming currying pointfree ramda.js

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

var _average = function(xs) {
  return R.reduce(R.add, 0, xs) / xs.length;
};
Run Code Online (Sandbox Code Playgroud)

我已经有一段时间了,但R.divide由于分子和分母首先需要评估,因此该功能让我失望

dav*_*ers 7

使用R.converge:

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

使用R.lift(比一般更适用的功能R.converge):

//    average :: Array Number -> Number
const average = R.lift(R.divide)(R.sum, R.length);
Run Code Online (Sandbox Code Playgroud)


Min*_*our 5

这是一种方法:

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

基本上,R.juxt将数组值映射到R.sum,R.length并为您提供一个数组和数组长度的数组.结果适用于R.divide.