【问题标题】:Why isn't this basic "R.useWith" working properly?为什么这个基本的“R.useWith”不能正常工作?
【发布时间】:2016-10-06 19:07:21
【问题描述】:

我对 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 需要一个函数,并将映射每个@ 987654330@ 从myArray 到那个函数。因此,正如预期的那样,这是可行的:

mapMyArray( setFooToBar )

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

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

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

我希望这会返回与前一种方法相同的内容,即一个新的对象数组,每个对象的新属性 foo 设置为 bar。但是,它实际上是返回一个新函数。我无法弄清楚我在哪里缺少论点。

提前感谢您的帮助!

【问题讨论】:

    标签: javascript functional-programming ramda.js


    【解决方案1】:

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

    您可以在 Ramda REPL 中看到这一点。

    【讨论】:

    • 啊,非常感谢,斯科特!这完全有道理……真是个愚蠢的错误。
    • 这表明cyclical placeholders 是直观的。 ;)
    猜你喜欢
    • 2023-02-20
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    相关资源
    最近更新 更多