ruby - 在 ruby​​ 中将函数作为参数传递

标签 ruby functional-programming closures

我正在努力研究 ruby​​ 中的函数式编程,但似乎没有太多好的文档。

本质上,我正在尝试编写一个具有 Haskell 类型签名的组合函数:

[a] -> [a] -> (a -> a -> a) -> [a]

所以

combine([1,2,3], [2,3,4], plus_func) => [3,5,7]
combine([1,2,3], [2,3,4], multiply_func) => [2,6,12]

等等

我发现了一些关于使用 zip 和 map 的东西,但使用起来感觉真的很难看。

什么是最“ ruby ”的实现方式?

最佳答案

嗯,您说过您了解 zip 和 map,所以这可能没有帮助。 但我会发布以防万一。

def combine a, b
    a.zip(b).map { |i| yield i[0], i[1] }
end

puts combine([1,2,3], [2,3,4]) { |i, j| i+j }

不,我也不觉得它漂亮。

edit - #ruby-lang @irc.freenode.net 建议:

def combine(a, b, &block)
    a.zip(b).map(&block)
end

或者这个,如果你想转发参数:

def combine(a, b, *args, &block)
    a.zip(b, *args).map(&block)
end

关于ruby - 在 ruby​​ 中将函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/444285/

相关文章:

ruby-on-rails - 生产中的 Rails 5 控制台不从环境中读取数据库密码

javascript - 使用函数式编程 [filter, map, some, reduce etc] 在 Typescript 中过滤数组

swift - 内部闭包的捕获列表是否需要将 `self` 重新声明为 `weak` 或 `unowned`?

thread-safety - 无法在线程之间发送 &str,因为它的生存时间不够长

ruby - Sidekiq 不创建 PID 文件

ruby-on-rails - 如何在我的 rspec Controller 示例中测试基本身份验证?

ruby-on-rails - 如何对这个哈希数组进行分组?

python - 如何使 MyList 可迭代?

scala - 减少Scala中的选项?

r - 无环境序列化闭包