あなたはすべての関数のカリー化バージョンを作成する必要があり、のは、必要な機能をとしてa
を持っているとしましょう、その後a
で各のカレーバージョンを呼び出し、最後にR.pipe
または
R.reduce
のいずれかにb
を使用最初の引数は、その後、我々はまず、以下の式
h(a, g(a, f(a, b)))
を達成したい(その特定の順序で)f,g,h
ありますすべての次は、私たちがのカリー化バージョンを作成することができます。この機能は、すべての必要な引数を受信したとき、それは単にfn(v)
const rev = R.curry((v, fn) => fn(v))
を返します、の2つの引数、単一の値v
と機能fn
を受けカリー化関数を作成してみましょうR.map
とR.curry
// note the reversed order of the functions
// I'll use R.compose instead of R.pipe
let curriedVersion = R.map(R.curry, [h,g,f])
と機能我々はまた、カリー化関数の最初の引数としてa
を使用する必要があるしかし、私たちが使用してa
で各カレー機能を呼び出すことができますR.map
代わりに、我々は最後の(つまり、特定の順序で機能f,g,h
用)R.compose
とb
const result = R.compose.apply(undefined, curriedVersion)(b)
ワンライナーでカリー化関数のこの配列を使用してみましょうrev
const curriedVersion = R.map(R.compose(rev(a), R.curry), [h,g,f])
私たちの特別な機能を使用します。
const solver = (a, b) => R.compose.apply(undefined, R.map(R.compose(rev(a), R.curry), [h,g,f]))(b)
const add = (a, b) => a + b
const sub = (a, b) => a - b
const mul = (a, b) => a * b
const rev = R.curry((v, fn) => fn(v))
const solver = (a, b) => R.compose.apply(undefined, R.map(R.compose(rev(a), R.curry), [mul,sub,add]))(b)
// mul(2, sub(2, add(2, 3)))
// mul(2, sub(2, 5))
// mul(2, -3)
// -6
console.log(solver(2, 3))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.21.0/ramda.min.js"></script>
R.appipe(R.apoc( 'b')、R.assoc( 'c')])、R.apply(R.apoc、 ))(2)({a:1})// = {a:1、b:2、c:2} ' – MattMS