2016-10-05 12 views
2

私はRamdaにとってかなり新しく、特定の機能を頭に入れようとしています。現在、私はR.useWithと少し苦労しています。なぜこの基本的な "R.useWith"は正しく動作していませんか?

let myArray = [ 
    { 
    a: 'wat', 
    b: 'foo' 
    }, 
    { 
    a: 'something', 
    b: 'something_else' 
    }, 
    { 
    a: 'booyah', 
    b: 'duh' 
    } 
]; 

そして、私は、各オブジェクトにbarに等しくなるようにfooのプロパティを設定する:

のは、私はオブジェクトの配列を持っているとしましょう。私はこれを行ういくつかの方法があることを知っています、私はこの機能を学ぶことを試みる間、私は人為的な例としてこれを使用しています。一つの方法は、これを行うになります

let setFooToBar = R.assoc('foo')('bar'); 
let mapMyArray = R.map(R.__, myArray); 

をので、この時点で、私は、オブジェクトを受け取る関数setFooToBarを持っている、とbarにプロパティfooを設定します、と私は機能を期待する機能mapMyArrayを持っている、となります各objectmyArrayからその機能にマップします。だから、予想通り、この作品:このアプローチは、私はそれを期待する方法が機能しない理由

mapMyArray(setFooToBar)

、私は理解していないものを、次のとおりです。

let callFirstWithSecond = (arg1, arg2) => arg1(arg2); 

R.useWith( 
    callFirstWithSecond, 
    [ 
    R.map(R.__), 
    R.assoc('foo') 
    ] 
)(myArray, 'bar') 

私はこれが、以前のアプローチと同じこと、オブジェクトの新しい配列、それぞれfooの新しいプロパティがbarに設定されたものを返すと期待します。しかし、実際には新しい関数を返しています。私はどこに議論がないのか分かりません。

ありがとうございました!

答えて

2

useWithの理解に間違いはありません。

問題がR.__

R.map(R.__) 

では意味がない最後の引数としてプレースホルダを使用して、プレースホルダを使用することです。これは、「ここに来る議論は後で提供される」というシグナルとして使われています。 Ramdaの機能はすでにカレー化されているので、何もせずにそれを使用すると、ノーオペレーションができなくなります。

let someFunc = (p1, p2, p3, p4) => 'whatever'; 
someFunc(argA, __, __, argD) ~> 
    (p2, p3) => someFunc(argA, p2, p3, argD) 

// but 
someFunc(argA, argB, __, __) ~> 
    (p3, p4) => someFunc(argA, argB, p3, p4) ~== 
    someFunc(argA, argB) 

あなたはR.flip(R.map)R.map(R.__)を置き換えることにより、必要な動作を得ることができます。

Ramda REPLでこれを確認できます。

+0

ああ、ありがとう、スコット!それは全然意味をなす...なんて愚かな間違い。 –

+0

これは[周期的プレースホルダー](https://github.com/sanctuary-js/sanctuary-def/issues/73)が直感的であることを示唆しています。 ;) – davidchambers

関連する問題