我的团队正在从Lodash转到Ramda,并进入函数式编程风格的更深层次。我们已经在compose
等方面进行了更多的实验,并遇到了这种模式:
const myFunc = state => obj => id => R.compose(
R.isNil,
getOtherStuff(obj),
getStuff(state)(obj)
)(id)
((我们当然可以省略=> id
和(id)
部分。为清楚起见添加。)
换句话说,我们的应用程序中有很多函数(在某些情况下为React + Redux),我们需要编写带有相似参数的函数,或者最后一个函数需要传递所有参数,然后再传递给下一个compose
行中的功能。在我给出的示例中,将是id
,然后是obj
,然后是state
,代表getStuff
。
如果不是getOtherStuff
功能,我们可以R.curry
myFunc
。
是否有一个优雅的解决方案可以解决这个问题?在FP中,这似乎很常见。
我不知道你为什么不能咖喱:
const myFunc = curry(state, obj) => R.compose(
R.isNil,
getOtherStuff(obj),
getStuff(state)(obj)
));
或
const myFunc = curry(state, obj, id) => R.compose(
R.isNil,
getOtherStuff(obj),
getStuff(state)(obj)
)(id));
我不确定我是否在这里看到了无积分的解决方案(按现状)。有一些不太直观的组合器可能适用。我还要考虑的另一件事是,getStuff和getOtherStuff函数是否具有正确顺序的签名。
也许按以下顺序定义它们会更好:obj,state和id。问题是在两个不同的函数中需要obj。也许重述getStuff以返回一对,而getOtherStuff以获取一对。
const myFunc = R.compose(
R.isNil, // (val2) -> (boolean)
getOtherStuff, // (obj, val) -> (obj, val2)
getStuff // (obj, state, id) -> (obj, val)
);
myFunc(obj)(state)(id)
[我发现将多个参数函数视为采用单个参数而恰好是某种元组的函数很有帮助。