Sha*_*ese 5 ruby closures functional-programming
我试图用ruby中的函数式编程来解决这个问题,似乎没有太多好的文档.
本质上,我正在尝试编写一个具有Haskell类型签名的组合函数:
[a] -> [a] -> (a -> a -> a) -> [a]
Run Code Online (Sandbox Code Playgroud)
所以
combine([1,2,3], [2,3,4], plus_func) => [3,5,7]
combine([1,2,3], [2,3,4], multiply_func) => [2,6,12]
Run Code Online (Sandbox Code Playgroud)
等等
我发现了一些关于使用zip和map的东西,但是使用它感觉真的很难看.
实现这样的东西最"红宝石"的方式是什么?
小智 10
好吧,你说你知道拉链和地图所以这可能没有帮助.但我会发布以防万一.
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 }
Run Code Online (Sandbox Code Playgroud)
不,我也不觉得它很漂亮.
编辑 -#ruby-lang @ irc.freenode.net建议:
def combine(a, b, &block)
a.zip(b).map(&block)
end
Run Code Online (Sandbox Code Playgroud)
或者,如果你想转发args:
def combine(a, b, *args, &block)
a.zip(b, *args).map(&block)
end
Run Code Online (Sandbox Code Playgroud)