[英]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)])
看起來不錯,只要juxt
( juxtapose
的縮寫)對你有意義。 但很多時候,推動無積分似乎弊大於利。
我也試過,
// 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.