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

Javascript 使用Ramda返回应用函数数组,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我想用一个值调用一个函数数组,并得到一个部分应用函数数组 我当前的代码: const my_array = pipe(flip(call), flip(map)([add, subtract]))(1) // = [add(1), subtract(1)] 有更好的方法吗 我的目标(可能不合理)是为以下功能提供一个替代方案: const bind_all = (funcs) => pipe(flip(call), flip(map)(funcs)) bind_all([add, subt

我想用一个值调用一个函数数组,并得到一个部分应用函数数组

我当前的代码:

const my_array = pipe(flip(call), flip(map)([add, subtract]))(1)
// = [add(1), subtract(1)]
有更好的方法吗

我的目标(可能不合理)是为以下功能提供一个替代方案:

const bind_all = (funcs) => pipe(flip(call), flip(map)(funcs))
bind_all([add, subtract])(1)
// = [add(1), subtract(1)]
这似乎类似于,但返回的是数组而不是函数


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


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

我不知道为什么当你的代码最终看起来像垃圾时,人们坚持做任何事情都是无点的-翻转这个,翻转那个。真是个笨蛋

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]

如果你一心想写无点的东西,那就写你自己的combinator吧

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]

我不知道为什么当你的代码看起来像垃圾时,人们坚持做任何事情都是无点的——翻转这个,翻转那个。真是个笨蛋

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]

如果你一心想写无点的东西,那就写你自己的combinator吧

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]

也许我错过了什么,但似乎做了你需要的

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

更新:正如评论中指出的,这并没有捕获原始需求。我认为以下方法确实有效。它与中的类似,但创建了一个可重用函数,而不是简单地内联运行:

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]
显然,如果我们愿意,我们可以用一种处理多个参数的方式来编写它。使用它创建部分函数一次,然后再次将参数应用于它们,感觉也非常优雅


你可以在上看到这一点,也许我遗漏了什么,但似乎确实做了你需要的事情

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

更新:正如评论中指出的,这并没有捕获原始需求。我认为以下方法确实有效。它与中的类似,但创建了一个可重用函数,而不是简单地内联运行:

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]
显然,如果我们愿意,我们可以用一种处理多个参数的方式来编写它。使用它创建部分函数一次,然后再次将参数应用于它们,感觉也非常优雅


你可以在地图(f=>f(1),[add,subtract])上看到这一点。比原来的解决方案更容易理解,但公平地说,问题是:有更好的方法吗?(是的,有)定义“更好”-更好,如“你未来的自我和同事会感谢你编写他们可以阅读的代码”-更好?
(1)(1)
在这里是一个幸运的调用
R.map($(7),R.map($(1),[R.add,R.subtract])
导致
[8,-6]
(注意负号),因为拉姆达部分应用中缀运算符的混乱性质。@ScottSauyet你是什么意思<代码>R。减法(1)(7)(
1-7
)应该是
-6
。我不知道你指的是什么。@naomik嗯,对不起,如果我不清楚,我的意思是我同意你。马特在问是否有比他的更好的方法,我相信你的是。对于我能想到的每一个“更好”的定义:)
map(f=>f(1),[add,subtract])
比最初的解决方案更容易理解,但公平地说,这就是问题:有更好的方法吗?(是的,有)定义“更好”-更好,如“你未来的自我和同事会感谢你编写他们可以阅读的代码”-更好?
(1)(1)
在这里是一个幸运的调用
R.map($(7),R.map($(1),[R.add,R.subtract])
导致
[8,-6]
(注意负号),因为拉姆达部分应用中缀运算符的混乱性质。@ScottSauyet你是什么意思<代码>R。减法(1)(7)(
1-7
)应该是
-6
。我不知道你指的是什么。@naomik嗯,对不起,如果我不清楚,我的意思是我同意你。马特在问是否有比他的更好的方法,我相信你的是。对于我能想到的每一个“更好”的定义:)有趣但
juxt([add,flip(subtract)])
返回一个函数,而不是数组。在电话上试着编码是不行的!很抱歉。更新的版本似乎确实符合要求。:-)有趣但
juxt([add,flip(subtract)])
返回一个函数,而不是数组。在电话上试着编码是不行的!很抱歉。更新的版本似乎确实符合要求。:-)