[英]Return array of applied functions with Ramda
我想用一個值調用一個函數數組,並獲取部分應用函數的數組。
我當前的代碼:
const my_array = pipe(flip(call), flip(map)([add, subtract]))(1)
// = [add(1), subtract(1)]
有更好的方法嗎?
我的目標(可能是不合理的)是為以下功能提供一種無積分的替代品:
const bind_all = (funcs) => pipe(flip(call), flip(map)(funcs))
bind_all([add, subtract])(1)
// = [add(1), subtract(1)]
這似乎類似於juxt ,但是返回一個Array而不是一個函數。
更新:作為對答案的回應,我同意由於試圖強制采用無點方法(對現有模式的了解有限),我的當前代碼遠非易讀。 這個問題只是試圖探索保持可讀性的無點設計的局限性。
當前的答案似乎表明這實際上是不合理的。
我不知道為什么當代碼最終看起來像垃圾時,人們堅持要無意義地做所有事情-翻轉,翻轉。 真是令人費解。
pipe(flip(call), flip(map)([add, subtract]))(1)
如果您有[add, subtract]
和1
並且希望有[add(1), subtract(1)]
只需編寫該死的映射函數
map(f => f(1), [add, subtract])
// => [add(1), subtract(1)]
我們可以看到重復執行此操作將如何為我們提供完全應用的功能
map(f => f(1), map(f => f(1), [add, subtract]))
// => [add(1)(1), subtract(1)(1)]
// => [2, 0]
如果您全心全意地編寫所有內容,請編寫自己的組合器
const $ = x => f => f (x)
R.map($(1), [R.add, R.subtract])
// => [add(1), subtract(1)]
R.map($(1), R.map($(1), [R.add, R.subtract]))
// => [add(1)(1), subtract(1)(1)]
// => [2,0]
juxt([add, flip(subtract)])(1)(7); //=> [8, 6]
更新:正如評論中指出的那樣,這沒有滿足原始要求。 我認為以下方法可以。 它與@naomik中的類似,但是創建了一個可重用的函數,而不是簡單地內聯運行:
const callAll = curry((fns, arg) => map(fn => fn(arg), fns));
const partials = callAll([add, subtract], 10); //=> [add(10), subtract(10)]
callAll(partials, 3); //=> [10 + 3, 10 - 3] => [13, 7]
顯然,如果需要的話,我們可以使用處理多個參數的方式編寫此代碼。 一次使用它來創建部分函數,然后再次將參數應用於它們也感覺很優雅。
您可以在Ramda REPL上看到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.