[英]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.