[英]Return array of applied functions with Ramda
我想用一个值调用一个函数数组,并获取部分应用函数的数组。
我当前的代码:
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)]
这似乎类似于juxt ,但是返回一个Array而不是一个函数。
更新:作为对答案的回应,我同意由于试图强制采用无点方法(对现有模式的了解有限),我的当前代码远非易读。 这个问题只是试图探索保持可读性的无点设计的局限性。
当前的答案似乎表明这实际上是不合理的。
我不知道为什么当代码最终看起来像垃圾时,人们坚持要无意义地做所有事情-翻转,翻转。 真是令人费解。
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]
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上看到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.