2017-05-09 44 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爲你自動執行的。