使用Ramda使函数pointfree

时间:2017-05-09 12:05:41

标签: javascript functional-programming ramda.js pointfree

如何使以下功能无点(使用Ramda)?

const prefixAll = R.curry((prefix, list) => R.map(R.concat(prefix), list))

3 个答案:

答案 0 :(得分:7)

此外,这应该工作

R.useWith(R.map, [R.concat, R.identity])

  

R.identity是函数的正确性,请参阅@ scott-sauyet的评论。)

see Ramda REPL

P.S:但我个人认为,compose更好 - 使用论证的部分应用是更具功能性的方法。例如R.compose(R.map, R.concat)('a')(['a','b'])

答案 1 :(得分:2)

我将代码输入pointfree.io(我首先将其转换为Haskell \prefix list -> map (prefix ++) list),然后返回:

map . (++)

所以JavaScript等价物应该是:

const prefixAll = R.compose(R.map, R.concat);

当我在ramda's REPL中测试时,我认为我获得了所需的结果。

答案 2 :(得分:0)

IMO最简单的方法是使用在这种情况下通过R.lift解除R.concat函数来实现的理解。

const prefixAll = R.lift(R.concat);
prefixAll(['hi-'], ['you', 'there']); // => ["hi-you", "hi-there"]

请注意,前缀必须作为单元素数组传递。 Ramda会为您自动调整此功能。