使用Ramda返回应用函数的数组

时间:2017-05-01 14:54:27

标签: javascript functional-programming ramda.js

我想用一个值调用一个函数数组,然后得到一个部分应用函数的数组。

我目前的代码:

const my_array = pipe(flip(call), flip(map)([add, subtract]))(1)
// = [add(1), subtract(1)]

有更好的方法吗?

我的目标(可能是不合理的)是替换以下函数point-free

const bind_all = (funcs) => pipe(flip(call), flip(map)(funcs))
bind_all([add, subtract])(1)
// = [add(1), subtract(1)]

这似乎与juxt类似,但返回的是数组而不是函数。

更新:为了回答答案,我同意我的当前代码远非可读,因为我试图强制采用无点方法(对现有模式的了解有限)。 这个问题只是试图探索保持可读性的无点设计的局限性。

目前的答案似乎表明这实际上是不合理的。

2 个答案:

答案 0 :(得分:2)

我不知道为什么当你的代码最终看起来像垃圾时,人们坚持要做一切无点的事情 - 翻转它,翻转它。什么是脑力*。

pipe(flip(call), flip(map)([add, subtract]))(1)

如果您有[add, subtract]1,并希望[add(1), subtract(1)]只是写出该死的映射函数

map(f => f(1), [add, subtract])
// => [add(1), subtract(1)]

我们可以看到重复这个将如何为我们提供完全应用的功能

map(f => f(1), map(f => f(1), [add, subtract]))
// => [add(1)(1), subtract(1)(1)]
// => [2, 0]

如果您注重编写所有无点的内容,请编写自己的组合器

const $ = x => f => f (x)

R.map($(1), [R.add, R.subtract])
// => [add(1), subtract(1)]

R.map($(1), R.map($(1), [R.add, R.subtract]))
// => [add(1)(1), subtract(1)(1)]
// => [2,0]

答案 1 :(得分:2)

也许我错过了一些东西,但juxt似乎确实做了你需要的东西

juxt([add, flip(subtract)])(1)(7); //=> [8, 6]

更新:正如评论中指出的那样,这并未捕获原始要求。我认为以下方法可行。它类似于@naomik中的那个,但创建了一个可重用的函数,而不是简单地运行内联:

const callAll = curry((fns, arg) => map(fn => fn(arg), fns));

const partials = callAll([add, subtract], 10); //=> [add(10), subtract(10)]
callAll(partials, 3); //=> [10 + 3, 10 - 3] => [13, 7]

显然,如果我们愿意,我们可以用处理多个参数的方式编写它。使用它一次创建部分函数,​​然后再次将参数应用于它们也感觉非常优雅。

您可以在 Ramda REPL 上看到这一点。