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');
是否有一個更清潔或更優雅的方式來處理,你需要使用你的數據的情況下在將其輸入管道之前建立管道?
謝謝!我想我還是試圖找出「正確」的方法是寫功能碼是什麼(不是真有其實這樣的事情)。我有點被掛斷了。你的方式更具可讀性。 – ctcutler
同意。 Ramda有一些巧妙的功能,如'useWith'和'converge',以及保護區暴露附加的如'meld'和'S'-組合子。它們偶爾非常有用且非常易讀,但是它們經常會降低可讀性,應該跳過。 –