为什么这个基本的“R.useWith”不能正常工作?

时间:2016-10-05 19:52:50

标签: javascript functional-programming ramda.js

我对Ramda很新,并且仍然试图绕过某些功能。目前,我正在与R.useWith进行一些斗争。

假设我有一个对象数组:

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

我想在EACH对象上将foo的属性设置为等于bar。我知道有几种方法可以做到这一点,而我只是在尝试学习这个功能时将其作为一个人为的例子。一种方法是这样做:

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

所以在这一点上,我有一个期望一个对象的函数setFooToBar,并将属性foo设置为bar,并且我有一个期望的函数mapMyArray一个函数,并将每个objectmyArray映射到该函数。因此,正如预期的那样,这有效:

mapMyArray( setFooToBar )

现在,我不明白的是,为什么这种方法没有像我期望的那样工作:

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

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

我希望这会返回与前一种方法相同的东西,一个新的对象数组,每个对象的新属性foo都设置为bar。但是,它实际上是返回一个新功能。我无法弄清楚我在哪里缺少参数。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您对useWith的理解没有错。

问题是在

中使用占位符R.__
 R.map( R.__ )

使用占位符作为最后一个参数没有意义。它被用作一个信号,“此处的参数将在稍后提供。”由于Ramda函数已经被curry,使用它没有任何可遵循的是无操作。

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.map( R.__ )替换为R.flip( R.map )来获得所需的行为。

您可以在 Ramda REPL

中查看此操作