需要为Proc实现Haskell的翻转

时间:2012-12-20 20:17:43

标签: ruby haskell functional-programming

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课程。

2 个答案:

答案 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 }