2

我需要 JavaScript 中 Clojurejuxt函数的功能。这有本机功能吗?我们正在使用Ramda 函数式 JavaScript 库。是否有带有该功能的 Ramdajuxt功能?

我知道,当然,我可以自己编写这个函数。这是出于教育目的。

4

4 回答 4

2

有几种方法可以实现这一目标。

R.converge,它将给定值通过提供的列表中的每个函数传递,然后将每个函数的结果用作作为第一个参数提供的函数的相应参数位置converge- 也许用图表更好地解释:

add  = (a, b) => a + b
incr = a => a + 1
decr = a => a - a
double = converge(add, [incr, decr])

       ------       ---
5 ----| incr |- 6 -| a |
   \   ------      | d |- 10
    \-| decr |- 4 -| d |
       ------       ---

这可以用来模拟类似juxt如下的东西:

var argsId = R.unapply(R.identity);
var juxt = R.converge(argsId);
var addSubtract10 = juxt([R.add(10), R.subtract(10)]);
addSubtract10(5); //=> [15, 5]

或者(虽然可能不太直观),R.commute也可以用于函数列表。R.commute获取某个应用类型的列表,并有效地将其从里到外变成某个列表的应用,其中 Ramda 现在提供的函数的应用行为类似于converge.

var juxt = R.commute(R.always);
var addSubtract10 = juxt([R.add(10), R.subtract(10)]);
addSubtract10(5); //=> [15, 5]
于 2015-10-27T08:43:11.713 回答
1

在某种程度上,R.ap看起来像你想要的。

于 2015-10-27T07:10:58.590 回答
0

还有另一个相当简单的 Ramda 解决方案:

var juxt = R.useWith(R.ap, [R.identity, R.of]);

这在 Ramda 的问题 #986中进行了讨论,但当没有人站出来支持这个想法时,最终被放弃了。随时将其恢复。

于 2015-10-27T13:01:59.440 回答
0

从版本 v0.19.0 Ramda 添加并列

于 2021-05-10T17:53:55.257 回答