【问题标题】:Call a list of functions with the same argument in ramda在 ramda 中调用具有相同参数的函数列表
【发布时间】:2020-05-10 02:14:43
【问题描述】:

假设我有一个函数列表,我想用相同的参数调用这些函数并获得一个结果列表。这是我的setup

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]

但我不太喜欢箭头函数的使用(纯粹出于文体原因),所以我想将其重写为,

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

我不明白为什么x => x(input) 不等于call(__, input)。我的想法是,call(__, input) 将返回一个函数,该函数将使用input 调用其第一个参数。

你能解释一下我做错了什么吗?我的预感是我误解了__ 的用法。以及如何使用call 或其他一些内置函数来优雅地编写这个?

我也试过了,

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

但由于文体原因,这也不适合我。我觉得我在用flip 硬塞东西,我也不喜欢连续的函数调用(...)(...)

【问题讨论】:

  • 箭头函数是未来。学习它们,使用它们。可以添加add(...)函数的代码吗?
  • @aepifano:我认识他们。我一直在使用它们,对它们没有任何反对意见。我只是不明白为什么这两个东西不等价,就是这样。

标签: javascript ramda.js


【解决方案1】:

您正在寻找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>

【讨论】:

  • 难以置信。谢谢。
【解决方案2】:

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

至于为什么call 不起作用……老实说,它可能是所有 Ramda 中设计最差的功能。 (我是 Ramda 的创始人之一,我想是我写的,所以除了我自己,我没有侮辱任何人。)

对它的需求非常非常少。既然可以写fn(1, 2),为什么还要写call(fn, 1, 2)。柯里化不能正常工作,因为它是可变参数,这本身就是一个问题。甚至这个例子也很不清楚,主要是因为很难找到任何有意义的例子。

我个人会跳过使用它。

但我不太喜欢箭头函数的使用(纯粹出于文体原因),所以我想将其重写为,

在 cmets 中,我假设您不是指与函数声明或函数表达式相反的箭头函数,而是您更愿意写这个无点。一个建议:使用无点样式,它可以使您的代码更具可读性,但如果没有,请跳过它;不要把它当成恋物癖。

这里juxt([add(2), add(3), add(4)]) 看起来不错,只要juxtjuxtapose 的缩写)对您有意义。但通常情况下,推动无积分似乎弊大于利。

我也试过了,

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

但由于文体原因,这也不适合我。我觉得我在用flip 硬塞东西,

我倾向于同意。 flip 几乎不是任何问题的绝佳解决方案。但我通常更不喜欢占位符。就是没有让我满意!

我也不喜欢连续的函数调用(...)(...)

在这里我不同意。我已经将自己的代码转换为几乎普遍的完全咖喱风格。如果这涉及多个连续的函数调用和可怕的括号对接,那就这样吧。我只是发现它更容易合作和推理。

【讨论】:

  • 感谢您的洞察力。至于call 的可用性,我认为fn(<unknownArg>, knownArg) 形式的任何东西都会受益于占位符。但话又说回来,我们反复看到,在 Ramda 中,数据排在最后,如果函数是这样设计的,我们一开始就不需要占位符。
  • @sampathsris:同意。但是由于call 的糟糕设计,我们不能这样做,因为我们不知道会有多少参数。 flip 仍然有效,因为它只关心前两个参数,传递其余参数。
猜你喜欢
  • 2019-07-14
  • 2021-04-25
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多