2017-05-09 110 views
1

如何使用拉姆达使以下功能点免费使用?使用拉姆达使功能点免费使用

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

[xprod](http://ramdajs.com/docs/#xprod)也值得一看。它输出数组虽然...'R.xprod([“a”],[“b”,“c”,“d”])'returns'[[“a”,“b”],[“a” ,“c”],[“a”,“d”]]' – user3297291

回答

6

而且,这应该工作

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

R.identity是有功能的正确元数,见@斯科特 - sauyet的评论。)

see Ramda REPL

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

+0

如果你确实使用了这个,我会推荐一个小小的变体:'prefixAll = R.useWith(R.map,[R.concat,R.identity])''。这和上面的行为一样,但是这个函数会正确地报告它的参数。 –

+0

@ScottSauyet您能否详细阐述一下?我不遵循这一点。谢谢。 – jukben

+1

添加'identity'只是说有第二个参数,但在传入'map'之前不会修改。 'R.useWith(R.map,[R.concat])。length; // => 1',但是'R.useWith(R.map,[R.concat,R.identity])。length; // => 2'。我觉得让自己的职能正确地报告自己的职位(他们接受的参数的数量)是一个好公民的问题。当然,拉姆达的卷曲让水变得浑浊,因为它允许你使用这些不同的职位,但我认为全部参数是正确的行为。 –

2

我输入的代码为pointfree.io(以及我第一次把它转换哈斯克尔\prefix list -> map (prefix ++) list),并且它返回:

map . (++) 

所以JavaScript的等价应该是:

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

当我在ramda's REPL测试这个我认为我获得了期望的结果。

+0

拉姆达功能默认为咖喱,所以我认为R.curry在这里不需要 – marzelin

+0

@marzelin:谢谢。我其实对拉姆达一点都不熟悉,但很好地用几种语言来回转换,通常可以做到这一点。 –

+0

好吧,当两个参数一起给出时它不起作用 – marzelin

0

IMO最简单的方法是使用在这种情况下使用R.lift解除R.concat函数的解决方法。

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

请注意,前缀必须作为单个元素数组传递。 这个功能是由Ramda为你自动执行的。