簡體   English   中英

使用Ramda返回應用函數的數組

[英]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確實juxt您的需求

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM