2016-10-05 2 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에서 해당 기능으로 매핑하십시오. 따라서, 예상대로이 작동합니다

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

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

:

mapMyArray(setFooToBar)

이제

, 나는 이해하지 못하는 것,이 방법은 방법을 작동하지 않는 이유가 그것을 기대할 수있다 이전 접근법과 동일한 것을 반환하기를 기대합니다. 객체의 새 배열은 각각 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

관련 문제