【发布时间】:2016-05-28 14:38:51
【问题描述】:
我的目标是创建一个自定义映射函数,该函数首先需要过滤列表以保留,例如,在对每个项目调用提供的函数之前,仅保留偶数项。我确实需要对函数进行柯里化,并且第一个参数是函数,而不是列表。我相信签名应该是这样的:(a -> b) -> [a] -> [b]
当然有很多方法可以做到这一点。这是我第一次尝试的样子。
var isEven = x => x % 2 === 0;
var filterEvensMap = R.curry((fn, items) => R.map(fn, R.filter(isEven, items)));
filterEvensMap(R.negate, [1,2,3,4]); // [-2, -4]
但是,由于上面使用了带有 fn 和 items “胶水参数”的匿名函数,我不确定这是否是 Ramda 的预期使用方式。
下面我介绍了另一种方法。它似乎更符合 Ramda 的精神,但我不确定我是否过于复杂了。
var filterEvensMap = R.compose(
R.flip,
R.uncurryN(2)
)(R.compose(
R.flip(R.map),
R.filter(isEven)
));
我是否过于复杂了多个 compose 和 uncurryN?有没有更惯用的方法来实现这一点?根据您的经验,这重要吗?
提前致谢。
【问题讨论】:
标签: javascript functional-programming higher-order-functions currying ramda.js