0

以下函数reduceIfEven使用谓词检查 reducer 函数为每一步接收的值。如果谓词返回 true,则将该值添加到结果 ( acc) 中,否则从 reducer 原样返回结果。请注意,没有短路 - 所有值都被处理,要么被忽略,要么被添加到结果中。

const isEven = x => x % 2 === 0

const numbers = [
  1,
  2,
  3,
  4,
  5,
  6,
  7
]

const predicateIterator = (predicate, iterator) => (acc, value) =>
  predicate(value) ? iterator(acc, value) : acc;

const reduceIf = curry((predicate, iterator, seed, value) => 
  reduce(predicateIterator(predicate, iterator), seed, value));

const reduceIfEven = reduceIf(isEven, add, 0);

reduceIfEven(numbers); // 12 (2 + 4 + 6)

如何使用transduce创建可比较的函数?

我最初的尝试碰壁了,因为我需要第一个函数来接收结果和map不接收的值。

const transducer = compose(filter(isEven), ????(add));
const reduceIfEven = transduce(transducer, R.flip(R.append), []);

注意:这是一个学术练习。我只是对如何完成感兴趣,而不是是否应该以这种方式完成。

4

1 回答 1

2

使用文档中的isOdd示例transduce(),您都可以filter()使用add()累加器。

const { transduce, add, filter } = R

const numbers = [1,2,3,4,5,6,7]

const isEven = x => x % 2 === 0

const sumIfEven = transduce(filter(isEven), add, 0)

console.log(sumIfEven(numbers))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

于 2018-02-01T18:08:19.883 回答