假设我有一个函数列表,我想用相同的参数调用这些函数并得到一个结果列表。下面是我的 设置:
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
我也不喜欢连续的函数调用。(...)(...)
.
你要找的是 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中设计最差的功能。 (我是Ramda的创始人之一,我认为它是我写的,所以除了我自己,我没有侮辱任何人。)
它的必要性非常非常小。 你为什么要写 call(fn, 1, 2)
当你可以直接写 fn(1, 2)
. 咖喱不能正常工作,因为它是变异的,这本身就是一个问题。 即使是例子也很不清楚,主要是由于它难以 找到 任何有意义的例子。
我个人会直接跳过使用它。
但我不太喜欢使用箭头函数(纯粹出于风格上的原因),所以我想把它改写成。
从注释来看,我猜测你的意思不是指箭头函数,而不是指函数声明或函数表达式,而是说你更愿意写这种无点式。 一个建议:如果无点样式能让你的代码更易读,就使用它,但如果不能,就跳过它;不要把它当成一种癖好。
这里是 juxt([add(2), add(3), add(4)])
似乎不错,只要 juxt
(简称 juxtapose
)对你来说是有意义的。 但很多时候,推崇无点似乎弊大于利。
我也试过。
// this also works and produces [4, 5, 6] map(flip(call)(input), fns)
但由于风格上的原因,这也让我不太满意。我觉得自己好像在给一些东西塞上了
flip
,
我倾向于同意。 flip
并不是几乎所有问题的美妙解决方案。 但我通常更不喜欢占位。 就是没有让我满意的地方!
而且我也不喜欢连续的函数调用。
(...)(...)
.
这里我不同意。 我已经把自己的代码换成了一种几乎普遍的完全卷曲的风格。 如果这涉及到多个连续函数调用和可怕的括号对接,那就这样吧。 我只是觉得这样更容易工作和推理。