Javascript 为什么不是';“这是最基本的”;R.useWith";工作正常吗?

Javascript 为什么不是';“这是最基本的”;R.useWith";工作正常吗?,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我对Ramda还相当陌生,仍在努力思考某些函数。目前,我在R.useWith方面有些困难 假设我有一个对象数组: let myArray = [ { a: 'wat', b: 'foo' }, { a: 'something', b: 'something_else' }, { a: 'booyah', b: 'duh' } ]; 我想在每个对象上设置foo的属性,使其等于bar。我知道有几种方法可以做到这一点,我只是

我对Ramda还相当陌生,仍在努力思考某些函数。目前,我在
R.useWith
方面有些困难

假设我有一个对象数组:

let myArray = [
  {
    a: 'wat', 
    b: 'foo'
  },
  {
    a: 'something',
    b: 'something_else'
  },
  {
    a: 'booyah',
    b: 'duh'
  } 
];
我想在每个对象上设置
foo
的属性,使其等于
bar
。我知道有几种方法可以做到这一点,我只是在尝试学习这个函数时将其作为一个人为的例子。一种方法是:

let setFooToBar = R.assoc('foo')('bar');
let mapMyArray = R.map( R.__, myArray ); 
因此,在这一点上,我有一个函数
setFooToBar
,它需要一个对象,并将属性
foo
设置为
bar
,还有一个函数
mapMyArray
需要一个函数,并将
myArray
中的每个
对象映射到该函数。因此,正如预期的那样,这是可行的:

mapMyArray(setFooToBar)

现在,我不明白的是,为什么这种方法没有按照我预期的方式工作:

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

R.useWith( 
  callFirstWithSecond,
  [
    R.map( R.__ ),
    R.assoc('foo')
  ]
)( myArray, 'bar' )
我希望这将返回与前一种方法相同的东西,一个新的对象数组,每个对象的新属性
foo
设置为
bar
。然而,它实际上返回了一个新函数。我不知道我在哪里遗漏了论点


提前感谢您的帮助

您对
useWith
的理解没有错

问题是在中使用占位符
R.\uu

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


你可以在

中看到这一点,啊,非常感谢,斯科特!这完全有道理。。。这是一个多么愚蠢的错误。这表明你的直觉是正确的