2016-05-21 20 views
2

我试图将以下转换为无点风格:在传入要迭代的集合之前,部分将值应用于变换函数add的函数。 (使用Ramda.js)如何指定curried参数应用的顺序

R.compose(
    R.map, 
    R.add 
)(1, [1,2,3]) 

的问题是,R.add是元数2,如R.map。我希望应用程序以如下:

add(1) 
map(add(1)) 
map(add(1), [1,2,3]) 
[add(1,1), add(1,2), add(1,3)] 

但会发生什么,而不是是这样的:

add(1, [1,2,3]) 
map(add(1, [1,2,3])) 
<partially applied map, waiting for collection> 

任何人都知道的一种方式来指定这个行为?

回答

2

一个普通的composepipe不会这样做,因为要么会吸收提供给第一个函数的所有参数。拉姆达包括两个附加功能,convergeuseWith。在这种情况下useWith是一个将帮助:

useWith(map, [add, identity])(1, [1, 2, 3]); //=> [2, 3, 4] 

虽然identity不是绝对需要在这里,它给人的生成功能正确的元数。

+0

这样更优雅。谢谢(我是你工作的忠实粉丝)! – mLuby

+0

也许它更优雅,但我从未想过你的'nAry' /'uncurry'技术。对于这种特殊情况,这可能更具挑战性,但它也更灵活,更一般。有趣的东西。 –

2

想通了。如果有人好奇,这里就是要点。 (你可以在控制台上试试RamdaJS.com。)

0)对于基准线,这里是指向的版本。

func0 = x => R.map(R.add(x)) 
addOne = func0(1) 
addOne([1,2,3]) // [2,3,4] 

1)这里是无点核心,但它有上述问题的排序问题。

func1 = R.compose(R.map, R.add) 
addOne = func1(1) 
addOne([1,2,3]) // [2,3,4]) 
func1(1, [1,2,3]) // function 

2)如果组合物是unary(元数1)2的调用都需要应用所有PARAMS。

func2 = R.unary(R.compose(R.map, R.add)) 
addOne = func2(1) 
addOne([1,2,3]) // [2,3,4]) 

3)我们希望一个调用应用两个参数,可以使我们uncurry 2.

func3 = R.uncurryN(2, func2) 
func3(1, [1,2,3]) // [2,3,4]) 

4)为了证明FUNC2是组合的,让我们加倍的结果。

func4 = R.compose(
    R.map(R.multiply(2)), 
    R.uncurryN(2, func2) 
) 
func4(1, [1,2,3]) // [4,6,8]) 

5)替代给了我们一个完全无点的功能。

func5 = R.compose(
    R.map(R.multiply(2)), 
    R.uncurryN(2, R.unary(R.compose(
    R.map, 
    R.add 
))) 
) 
func5(1, [1,2,3]) // [4,6,8])