如果有关注,这篇文章是关于JavaScript中的函数式编程,在我的例子中我会使用Ramda库。
虽然我们工作中的每个人都完全接受了函数式编程,但也有很多讨论关于如何做得“正确”。
这两个函数将完全执行相同的操作:获取一个列表并返回一个新列表,其中所有字符串都已被修剪。
// data-centric style
const trimList = list => R.map(R.trim, list);
// point-free style
const trimList = R.map(R.trim);
到目前为止还不错。然而,对于一个更复杂的例子,两种风格之间的差异是显著的:取一个列表并返回一个新列表,在其中所有字符串都等于在对象中找到的属性。
var opts = {a: 'foo', b: 'bar', c: 'baz'};
var list = ['foo', 'foo', 'bar', 'foo', 'baz', 'bar'];
myFilter(opts, 'a', list); //=> ["foo", "foo", "foo"]
myFilter(opts, 'b', list); //=> ["bar", "bar"]
// data-centric style
const myFilter = (opts, key, list) => {
var predicate = R.equals(opts[key]);
return R.filter(predicate, list);
};
// point-free style
const myFilter = R.converge(
R.filter, [
R.converge(
R.compose(R.equals, R.prop), [
R.nthArg(1),
R.nthArg(0)]),
R.nthArg(2)]);
除了易读性和个人品味外,是否有可靠的证据表明在某些情况下一种风格比另一种更合适?
λx. f x
转换为f
,如果没有问题的话(当f
未定义时,在 call-by-value 中语义不同)。但除此之外就没有什么了…… - Jorge Adriano Branco Aires