我想用一个值调用一个函数数组,然后得到一个部分应用函数的数组。
我目前的代码:
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类似,但返回的是数组而不是函数。
更新:为了回答答案,我同意我的当前代码远非可读,因为我试图强制采用无点方法(对现有模式的了解有限)。 这个问题只是试图探索保持可读性的无点设计的局限性。
目前的答案似乎表明这实际上是不合理的。
答案 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 上看到这一点。