Return Ramda 的应用函数数组
Return array of applied functions with 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 类似,但返回的是数组而不是函数。
更新: 作为对答案的回应,我同意我当前的代码远非可读性,因为我试图强制采用一种无意义的方法(对现有的知识有限模式)。
本题只是想探索保持可读性的无点设计的极限。
目前的答案似乎表明这实际上是不合理的。
我不知道为什么当你的代码最终看起来像垃圾时人们坚持做所有无意义的事情 - 翻转这个,翻转那个。真是个脑残。
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
似乎可以满足您的需求
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.
上看到实际效果
我想用一个值调用一个函数数组,然后返回一个部分应用的函数数组。
我当前的代码:
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 类似,但返回的是数组而不是函数。
更新: 作为对答案的回应,我同意我当前的代码远非可读性,因为我试图强制采用一种无意义的方法(对现有的知识有限模式)。 本题只是想探索保持可读性的无点设计的极限。
目前的答案似乎表明这实际上是不合理的。
我不知道为什么当你的代码最终看起来像垃圾时人们坚持做所有无意义的事情 - 翻转这个,翻转那个。真是个脑残。
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
似乎可以满足您的需求
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.
上看到实际效果