javascript - 使用 Ramda 将 reducer 转换为传感器

标签 javascript functional-programming reduce ramda.js transducer

以下函数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), []);

注意:这是一项学术练习。我只是对如何做到这一点感兴趣,而不是是否应该这样做。

最佳答案

使用 transduce() 中的 isOdd 示例文档,您可以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>

关于javascript - 使用 Ramda 将 reducer 转换为传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48568786/

相关文章:

javascript - 在 Node.js 中导入钩子(Hook)

php - 以用户语言显示我的网站

haskell - 检查 Haskell 中函数的内部结构

functional-programming - funcall 的语法糖?

Javascript:将两个数组合并为单个对象而不丢失键顺序

javascript - 如何在 AngularJS 1.2 中仅使用模式的电子邮件验证?

javascript - jQuery 鼠标悬停/鼠标悬停显示/隐藏 div

java - 在 Java 流中添加多个字段(和条件流操作)

python:来自多个字典的联合键?

java - TwoDArrayWritable 中的行列值