2017-05-01 21 views
1

我想用一个值调用一个函数数组,然后获取部分应用函数的数组。用Ramda返回所应用函数的数组

我当前的代码:

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

也许我失去了一些东西,但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上看到此操作。

+0

有趣,但'juxt([add,flip(subtract)])'返回一个函数,而不是一个数组 –

+0

我误会了。它不会尝试在手机上编码!对于那个很抱歉。 –

+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] 
+0

'map(f => f(1),[add,subtract])比原来的解决方案更容易理解,但公平的问题是:还有更好的方法吗? (是的,有) –

+0

定义“更好” - *更好*,因为“你将来的自我和同事会感谢你编写他们可以阅读的代码” - *更好*? – naomik

+0

'(1)(1)'在这里是一个幸运的调用。 'R.map($(7),R.map($(1),[R.add,R.subtract]))'result in'[8,-6]'(注意负号),因为拉姆达部分应用中缀运营商的混淆本质。 –