繁体   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