使用 Ramda 将 Reducer 转换为 Transducer
Converting Reducer To Tranducer With Ramda
以下函数 reduceIfEven
使用谓词来检查 reducer 函数在每个步骤中接收的值。如果谓词 returns 为真,则将值添加到结果 (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), []);
注意:这是一个学术练习。我只是对如何完成感兴趣,而不是是否应该这样做。
使用 isOdd 示例中的 transduce()
documentation, you can filter()
all even, and 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>
以下函数 reduceIfEven
使用谓词来检查 reducer 函数在每个步骤中接收的值。如果谓词 returns 为真,则将值添加到结果 (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), []);
注意:这是一个学术练习。我只是对如何完成感兴趣,而不是是否应该这样做。
使用 isOdd 示例中的 transduce()
documentation, you can filter()
all even, and 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>