2016-06-18 21 views
4

我試圖使用Ramda庫,以瞭解在JavaScript的一些函數式編程和我一直運行到的情況下我撰寫了一堆功能,然後必須通過輸入結果的兩倍。下面,工作代碼是一個示例:如何在構建管道需要輸入時組合函數?

const search = R.invoker(1, 'search'); 
const substring = R.invoker(2, 'substring'); 
const lSplit = (pat, s) => R.compose(substring(0), search(pat))(s)(s); 
lSplit(/ /, 'foo bar'); 

lSplit需要一個正則表達式和一個字符串,位於字符串中的第一場比賽,並返回一切比賽的左側。最後一行評估爲'foo'。有必要通過s的組成功能兩次:先找到模式,並建立了子功能,然後第二次運行字符串的組成功能。該代碼有效,但(s)(s)似乎不雅。

我寫了一個叫twice函數,收拾了一點東西,但並沒有真正解決inelegance:

const search = R.invoker(1, 'search'); 
const substring = R.invoker(2, 'substring'); 
const twice = f => d => f(d)(d); 
const lSplit = pat => twice(R.compose(substring(0), search(pat))); 

lSplit(/ /)('foo bar'); 

是否有一個更清潔或更優雅的方式來處理,你需要使用你的數據的情況下在將其輸入管道之前建立管道?

回答

3

你的構圖看起來凌亂的原因是因爲你正在編寫一個二元函數search與三元函數substring。更糟糕的是,在「管道」的爭論發生在三元函數的中間

   _ search(/ /, s) 
      /
substring(0, /, s) 

而是擔心自己不能點免費的,我只想寫,表達它最好

const lSplit = (pat, s) => substring(0, search(pat,s), s); 
功能

這不聰明,但它是可讀的。我的建議是完成任務。

+0

謝謝!我想我還是試圖找出「正確」的方法是寫功能碼是什麼(不是真有其實這樣的事情)。我有點被掛斷了。你的方式更具可讀性。 – ctcutler

+1

同意。 Ramda有一些巧妙的功能,如'useWith'和'converge',以及保護區暴露附加的如'meld'和'S'-組合子。它們偶爾非常有用且非常易讀,但是它們經常會降低可讀性,應該跳過。 –

相關問題