2016-08-02 7 views
1

Ramdaに次の関数を組み込むことはできますか?Ramdaパイプで同じ第1引数を使用する

(a, b) => R.pipe(func1(a), func2(a))(b)

目的はpipeのすべての関数に引数aを渡しています。

R.pipe(R.juxt([func1, func2]), R.apply(R.pipe))

しかし、これはTypeError: Cannot read property 'length' of undefinedを与える:

私の最初の考えは以下の通りでした。

答えて

1

これは、構成する機能のアレイをとるようS.pipeを用いて表現することが容易です。

1つのオプションは使用することですR.ap

> S.pipe(R.ap([S.add, S.mult, S.add], [3]), 10) 
42 

別のオプションはS.T、ツグミコンビネータでR.mapを使用することです:作成するために、ラムダに

> S.pipe(R.map(S.T(3), [S.add, S.mult, S.add]), 10) 
42 

あなたは、これらのいずれかをラップすることができバイナリ関数:

const f = (a, b) => S.pipe(R.ap([S.add, S.mult, S.add], [a]), b); 

f(3, 10); // add(3)(mult(3)(add(3)(10))) 
// => 42 
+0

R.appipe(R.apoc( 'b')、R.assoc( 'c')])、R.apply(R.apoc、 ))(2)({a:1})// = {a:1、b:2、c:2} ' – MattMS

0

あなたはすべての関数のカリー化バージョンを作成する必要があり、のは、必要な機能をとして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.mapR.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.composeb

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>

+0

['R.apply '](http://ramdajs.com/docs/#apply)では' R.compose.apply(undefined、...) 'ではなく' – davidchambers

+0

@davidchambersの提案に感謝します! –

関連する問題