簡體   English   中英

在 ramda 中調用具有相同參數的函數列表

[英]Call a list of functions with the same argument in ramda

假設我有一個函數列表,我想用相同的參數調用這些函數並獲得一個結果列表。 這是我的設置

let input = 2
let fns = [add(2), add(3), add(4)]

map(x => x(input), fns)
// this is what I want. Outputs [4, 5, 6]

但我不太喜歡使用箭頭 function (純粹出於文體原因),所以我想將其重寫為,

map(call(__, input), fns)
// this doesn't work and produces [[Function],[Function],[Function]]

我不明白為什么x => x(input)不等同於call(__, input) 我的想法是, call(__, input)將返回一個 function ,它將使用input調用其第一個參數。

你能解釋一下我做錯了什么嗎? 我的預感是我誤解了__的用法。 我如何使用call或其他一些內置的 function 來優雅地寫這個?

我也試過,

// this also works and produces [4, 5, 6]
map(flip(call)(input), fns)

但由於文體原因,這也不適合我。 我覺得我在用flip硬塞東西,而且我也不喜歡連續的 function 調用(...)(...)

您正在尋找R.juxt

juxt 將函數列表應用於值列表。

 const { add, juxt } = R const input = 2 const fns = [add(2), add(3), add(4)] const addTo = juxt(fns) const result = addTo(input) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>

Ori Drori 表明juxt會做你想做的事。

至於為什么call不起作用......老實說,它可能是所有 Ramda 中設計最差的 function。 (我是 Ramda 的創始人之一,我想是我寫的,所以除了我自己,我沒有侮辱任何人。)

對它的需求非常非常少。 既然可以寫fn(1, 2) ,為什么還要寫call(fn, 1, 2) 2) 。 Currying 不能正常工作,因為它是可變參數,這本身就是一個問題。 甚至這個例子也很不清楚,主要是因為很難找到任何有意義的例子。

我個人會跳過使用它。

但我不太喜歡使用箭頭 function (純粹出於文體原因),所以我想將其重寫為,

從評論中,我假設您不是指箭頭函數,而不是 function 聲明或 function 表達式,而是您更願意寫這個無點。 一個建議:使用無點樣式,它可以使您的代碼更具可讀性,但如果沒有,請跳過它; 不要迷戀它。

這里juxt([add(2), add(3), add(4)])看起來不錯,只要juxtjuxtapose的縮寫)對你有意義。 但很多時候,推動無積分似乎弊大於利。

我也試過,

 // this also works and produces [4, 5, 6] map(flip(call)(input), fns)

但由於文體原因,這也不適合我。 我覺得我在用flip來固定一些東西,

我傾向於同意。 flip對於幾乎任何問題都不是一個很好的解決方案。 但我通常更不喜歡占位符。 就是沒有讓我滿意!

而且我也不喜歡連續的 function 調用(...)(...)

在這里我不同意。 我已經將自己的代碼轉換為幾乎普遍的完全咖喱風格。 如果這涉及多個連續的 function 調用和可怕的括號對接,那就這樣吧。 我只是發現它更容易使用和推理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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