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

问题描述 投票:0回答:4

如何将以下简单的

average
函数转换为 pointfree 形式(使用 Ramda)?

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

我已经这样做有一段时间了,但是

R.divide
函数让我失望,因为分子和分母需要首先求值

javascript functional-programming currying pointfree ramda.js
4个回答
8
投票

使用

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

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.sum
R.length
,这为您提供了一个包含数组总和和数组长度的数组。结果应用于
R.divide


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

0
投票

更简单的:

R.mean([1,3]) // returns 2
© www.soinside.com 2019 - 2024. All rights reserved.