Uncurry ramdajs函数

时间:2018-09-30 07:06:30

标签: ramda.js curry

我具有以下数据结构:

const cluster = {
    processes: [
        { color: 'test', x: 0, y: 0 },
        ...
    ],
};

现在我想使用以下符号进行功能:

// getProcess :: (Cluster, number) -> Process
getProcess(cluster, 0);
// => { color: 'test', x: 0, y: 0 }

好吧,我尝试使用ramdajs:

const getProcess = R.compose(R.flip(R.nth), R.prop('processes'));

对于getProcess(cluster)(0)来说很好用,但是对于getProcess(cluster, 0)来说它返回一个函数。

有没有办法用ramda解决这个问题,或者可能是更正确的实现?

2 个答案:

答案 0 :(得分:1)

您可以使用R.uncurryN来实现这一点,它只需使用您想要取消使用的参数数量以及curried函数即可。

const getProcess = R.uncurryN(2, R.compose(R.flip(R.nth), R.prop('processes')));

这适用于所有咖喱函数,无论是Ramda产生的还是类似下面的函数。

R.uncurryN(2, x => y => x + y)

使用R.useWith可以简洁地写出另一种方法,尽管我倾向于发现useWith的用法比其他方法可读性低。

const getProcess = R.useWith(R.nth, [R.identity, R.prop('processes')])
getProcess(0, cluster)

答案 1 :(得分:0)

有时候更直接的方法是可取的。

const getProcess = R.curry(
  (pos, entity) => R.path(['processes', pos], entity)
);