1 回答

TA貢獻1859條經驗 獲得超6個贊
我通常同意Bergi的評論。無點不應該是一個目標。當我開始編寫 Ramda 時,我就迷上了它,其中有許多功能旨在幫助使事情變得無意義。我很少再推薦他們了。我不認為useWith
或者converge
經常使函數更易于閱讀或維護。
但是有一個函數,lift
,在 FP 世界中廣為人知,在這里很有幫助。我認為是lift
將功能從價值領域提升到這些價值的容器領域。因此lift (add) (Maybe(3), Maybe(5)) //=> Maybe(8)
。當與產生我們的值的函數一起使用時,它可能會像這樣工作:
lift ((a, b) => a + b) (
n => n * 2,
n => n - 1
) (5)
//=> (5 * 2) + (5 -1) //=> 14`.
這正是您想要對您的功能做的事情。所以這是一個lift基于 - 的無點版本:
const hfffqs2 = either (
lift (has) (getFilterQueryString, getPages),
lift (has) (getFilterQueryString, getNewlyLoadedUsers)
)
我發現這比您上面的任何一個版本都更具可讀性。
我認為該版本可與我能想到的最簡單的非 Ramda 版本相媲美:
const hfffqs3 = state => {
const query = getFilterQueryString(state);
return query in getPages(state)
|| query in getNewlyLoadedUsers(state)
}
不過,它不一定更具可讀性。而且它的效率較低——除了額外的函數調用——它必須調用getFilterQueryString兩次。但它是一個可讀和可維護的功能。
如果lift還不是很清楚,中間格式可能如下所示:
const hfffqs1 = either (
state => has(getFilterQueryString(state), getPages(state)),
state => has(getFilterQueryString(state), getNewlyLoadedUsers(state))
)
通過應用getFilterQueryStringand getState,lift (has)我們得到state => has(getFilterQueryString(state), getPages(state)), 和下一行的等價物。我們已經將函數從字符串和對象領域提升到返回字符串和對象的函數領域。我們可以傳遞給這兩個函數來獲取一個字符串和一個對象。hasstate
您可以在以下代碼段中看到這些操作:
// Dummy implementations just for demo. `state` is a small integer.
const getFilterQueryString = (state) => ['foo', 'bar', 'baz', 'qux', 'corge', 'grault'][state]
const getPages = (state) => [{foo: 1, bar: 2}, {foo: 1, corge: 2, grault: 3}, {baz: 1}, {foo: 1, grault: 2}, {corge: 1, baz: 2}, {bar: 1, qux: 2}][state]
const getNewlyLoadedUsers = (state) => [{baz: 1, qux: 2}, {corge: 1, grault: 2}, {foo: 1, corge: 2}, {baz: 1, qux: 2}, {foo: 1, qux: 2}, {bar: 1, corge: 2}][state]
const hasFetchedForFilterQueryString = state => {
const filterQueryString = getFilterQueryString(state);
return either(
pipe(getPages, has(filterQueryString)),
pipe(getNewlyLoadedUsers, has(filterQueryString)),
)(state);
};
console .log ([0, 1, 2, 3, 4, 5].map(hasFetchedForFilterQueryString))
const hfffqs1 = either (
state => has(getFilterQueryString(state), getPages(state)),
state => has(getFilterQueryString(state), getNewlyLoadedUsers(state))
)
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs1))
const hfffqs2 = either (
lift (has) (getFilterQueryString, getPages),
lift (has) (getFilterQueryString, getNewlyLoadedUsers)
)
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs2))
const hfffqs3 = state => {
const query = getFilterQueryString(state);
return query in getPages(state)
|| query in getNewlyLoadedUsers(state)
}
console .log ([0, 1, 2, 3, 4, 5].map(hfffqs3))
.as-console-wrapper {min-height: 100% !important; top: 0}
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {either, pipe, has, lift} = R </script>
添加回答
舉報