Я не знаю, почему вы не можете карри, хотя:
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.
Проблема в том, что объект нужен в двух разных функциях. Возможно, перезапустите getStuff, чтобы вернуть пару, и getOtherStuff, чтобы взять пару.
const myFunc = R.compose(
R.isNil, // val2 -> boolean
snd, // (obj, val2) -> val2
getOtherStuff, // (obj, val) -> (obj, val2)
getStuff // (obj, state, id) -> (obj, val)
);
myFunc(obj)(state)(id)
Мне показалось полезным думать о функциях с несколькими параметрами как о функциях, которые принимают один параметр, который является своего рода кортежем.
getStuff = curry((obj, state, id) => {
const val = null;
return R.pair(obj, val);
}
getOtherStuff = curry((myPair) => {
const obj = fst(myPair)
const val2 = null;
return R.pair(obj, val2);
}
fst = ([f, _]) => f
snd = ([_, s]) => s
==== =
Обновление по вопросу о комбинаторах. Из http://www.angelfire.com/tx4/cus/combinator/birds.html есть комбинатор скворец (S):
λa.λb.λc.(ac)(bc)
, записанный более es6
const S = a => b => c => a(c, b(c))
или функция, которая принимает три параметра а, б, c. Мы применяем c к выходу из новой функции, а c к b, оставляя все, что немедленно применяется к функции, повторяющейся с c, применяемой к.
в вашем примере мы могли бы написать это как
S(getOtherStuff, getStuff, obj)
, но это может не сработать сейчас, когда я смотрю на это. потому что getStuff не полностью удовлетворен до того, как его применили к getOtherStuff ... Вы можете начать собирать вместе решение головоломки, что иногда забавно, но не то, что вам нужно в вашем рабочем коде. Есть книга https://en.wikipedia.org/wiki/To_Mock_a_Mockingbird людям нравится, хотя это сложно для меня.
Мой самый большой совет - начинайте думать обо всех функциях как одинарные.