6

Haskell 的 Prelude 有一个有用的函数可以交换函数的参数:http: //zvon.org/other/haskell/Outputprelude/flip_f.html

我需要在 Ruby 中做同样的事情。我不只是定义一个自定义方法,而是想对类进行修补,Proc以便我可以flipProc#curry. 就像是

f = lambda {|x, y| [x, y]}
g = f.flip.curry.(2)

为 提供一个值y

我不知道如何重新开课Proc来做到这一点。

4

2 回答 2

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]
于 2012-12-20T20:39:35.303 回答
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 }
于 2012-12-20T23:39:32.247 回答