2016-05-21 14 views
2

次の点をポイントフリースタイルに変換しようとしています:トランスフォーマ機能addに部分的に値を適用してから、カレー化されたパラメータアプリケーションの順序を指定するにはどうすればいいですか?

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

問題がR.mapあるようR.addは、アリティ2であることである(Ramda.js使用)。私は次のようにアプリケーションのためになりたい:

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

平文composeまたはpipeは、どちらも第1の関数に渡されたすべての引数を吸収するため、これを行いません。 Ramdaには、これに役立つ2つの追加機能、convergeuseWithが含まれています。この場合、useWithを助けるものです。

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

identityが絶対にここでは必要ありませんが、それが生成された関数に正しいアリティを与えます。

+0

これははるかに優雅です。ありがとう(と私はあなたの仕事の大きなファンです)! – mLuby

+0

これはもっとエレガントですが、以前はあなたの 'nAry' /' uncurry'テクニックについて考えたことはありませんでした。この特定のケースではそれはもっと難しいかもしれませんが、より柔軟でより一般的です。興味深いもの。 –

2

好奇心が強い人は、ここに要点があります。 (RamdaJS.comのコンソールで試すことができます)

0)ベースラインについては、ここでは尖ったバージョンです。

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)私たちは、両方のparamsを適用する一つの呼び出しをしたいので、私たち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)置換は、私たちに完全にpointfree機能を提供します。

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]) 
関連する問題