用于生成高阶函数的惯用 Ramda?
Idiomatic Ramda for generating higher order functions?
我的目标是创建一个自定义地图函数,该函数首先需要过滤列表以保留,例如,在对每个项目调用提供的函数之前仅保留偶数项。我确实需要柯里化函数,并且第一个参数是函数,而不是列表。我相信签名看起来像这样:(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
"glue parameters" 的匿名函数,我不确定这是否是 Ramda 打算使用的方式。
下面我介绍了另一种方法。它似乎更符合 Ramda 的精神,但我不确定我是否把事情复杂化了。
var filterEvensMap = R.compose(
R.flip,
R.uncurryN(2)
)(R.compose(
R.flip(R.map),
R.filter(isEven)
));
我是不是把多重组合和 uncurryN 搞得过于复杂了?有没有更惯用的方法来实现这一目标?根据您的经验,这重要吗?
提前致谢。
如果您发现 Haskell 个签名有用,您可能会发现这个 point-free generator (source) 也很有用。如果你想简化一个表达式,你可以输入等同于你的 JS 代码的 Haskell:
filterEvensMap = \fn items -> map fn (filter isEven items)
它会给你一个无积分等价物:
filterEvensMap = (. filter isEven) . map
然后使用 Ramda 翻译回 JS:
var filterEvensMap = R.curry(R.compose(R.compose(R.filter(isEven)), R.map))
In your experience, does it matter?
我会选择最易读的表达式,在这种情况下可能是原始表达式。无点很有趣,可以在某些地方增加清晰度,但它也会大大降低可读性,或者至少降低理解水平。
我的目标是创建一个自定义地图函数,该函数首先需要过滤列表以保留,例如,在对每个项目调用提供的函数之前仅保留偶数项。我确实需要柯里化函数,并且第一个参数是函数,而不是列表。我相信签名看起来像这样:(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
"glue parameters" 的匿名函数,我不确定这是否是 Ramda 打算使用的方式。
下面我介绍了另一种方法。它似乎更符合 Ramda 的精神,但我不确定我是否把事情复杂化了。
var filterEvensMap = R.compose(
R.flip,
R.uncurryN(2)
)(R.compose(
R.flip(R.map),
R.filter(isEven)
));
我是不是把多重组合和 uncurryN 搞得过于复杂了?有没有更惯用的方法来实现这一目标?根据您的经验,这重要吗?
提前致谢。
如果您发现 Haskell 个签名有用,您可能会发现这个 point-free generator (source) 也很有用。如果你想简化一个表达式,你可以输入等同于你的 JS 代码的 Haskell:
filterEvensMap = \fn items -> map fn (filter isEven items)
它会给你一个无积分等价物:
filterEvensMap = (. filter isEven) . map
然后使用 Ramda 翻译回 JS:
var filterEvensMap = R.curry(R.compose(R.compose(R.filter(isEven)), R.map))
In your experience, does it matter?
我会选择最易读的表达式,在这种情况下可能是原始表达式。无点很有趣,可以在某些地方增加清晰度,但它也会大大降低可读性,或者至少降低理解水平。