Haskell的Prelude有一个有用的函数来交换函数的参数:http://zvon.org/other/haskell/Outputprelude/flip_f.html
我需要在Ruby中做同样的事情。我不想仅定义自定义方法,而是想对Proc
类进行修补,以便flip
与Proc#curry
一起使用。像
f = lambda {|x, y| [x, y]}
g = f.flip.curry.(2)
为y
提供值。
我不知道如何重新开放Proc
课程。
答案 0 :(得分:6)
class Proc
def flip
lambda { |x, y| self.(y, x) }
end
end
f = lambda { |x, y| [x, y] }
f.flip.(1, 2)
#=> [2, 1]
答案 1 :(得分:1)
class Proc
def flip
lambda { |*args| self.curry[*args.reverse] }
end
end
plus = lambda {|a, b, c| a + b + c }
p plus['A', 'B', 'C'] # => "ABC"
p plus.flip['A', 'B', 'C'] # => "CBA"
p plus.curry['A']['B', 'C'] # => "ABC"
p plus.curry['A'].flip['B', 'C'] # => "ACB"
<强>更新强>
# intermediate transformations
plus.flip.curry['a']
lambda {|a, b, c| a + b + c }
# flip
lambda {|c, b, a| a + b + c }
# curry 'a', still a Proc because of currying
lambda {|b, c| 'a' + b + c }