调用ramda中参数相同的函数列表。

问题描述 投票:0回答:1

假设我有一个函数列表,我想用相同的参数调用这些函数并得到一个结果列表。下面是我的 设置:

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我也不喜欢连续的函数调用。(...)(...).

javascript ramda.js
1个回答
3
投票

你要找的是 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的创始人之一,我认为它是我写的,所以除了我自己,我没有侮辱任何人。)

它的必要性非常非常小。 你为什么要写 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 并不是几乎所有问题的美妙解决方案。 但我通常更不喜欢占位。 就是没有让我满意的地方!

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

这里我不同意。 我已经把自己的代码换成了一种几乎普遍的完全卷曲的风格。 如果这涉及到多个连续函数调用和可怕的括号对接,那就这样吧。 我只是觉得这样更容易工作和推理。

© www.soinside.com 2019 - 2024. All rights reserved.