Ruby 需要实施Haskell';让我们翻转一下程序

Ruby 需要实施Haskell';让我们翻转一下程序,ruby,haskell,functional-programming,Ruby,Haskell,Functional Programming,Haskell的前奏曲有一个有用的函数,可以交换函数的参数: 我需要用Ruby做同样的事情。不只是定义自定义方法,我想对Proc类进行猴子补丁,这样我就可以在Proc#curry旁边使用flip。差不多 f = lambda {|x, y| [x, y]} g = f.flip.curry.(2) 为y提供一个值 我不知道如何重新打开Proc类来实现这一点 class Proc def flip lambda { |x, y| self.(y, x) } end end f

Haskell的前奏曲有一个有用的函数,可以交换函数的参数:

我需要用Ruby做同样的事情。不只是定义自定义方法,我想对
Proc
类进行猴子补丁,这样我就可以在
Proc#curry
旁边使用
flip
。差不多

f = lambda {|x, y| [x, y]}
g = f.flip.curry.(2)
y
提供一个值

我不知道如何重新打开
Proc
类来实现这一点

class Proc
  def flip
    lambda { |x, y| self.(y, x) }
  end
end


f = lambda { |x, y| [x, y] }
f.flip.(1, 2)
#=> [2, 1]
更新:

# 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 }

我对咖喱这一点感到困惑,不是吗?您可以尝试翻转proc的参数,不管您是否想在之后使用它。这是正确的。咖喱和翻转是独立的。谢谢。我在想有这样的东西。不幸的是,这不适用于程序curry和部分应用程序。我认为现在应该可以了,我用一个curry和翻转的程序更新了示例。
plus.flip.curry['a']
返回部分应用的程序,该程序包含两个参数。试试
plus.flip.curry['a']['b','c']
,这会产生
abc
。我更新了示例以显示实际步骤。谢谢!我没有注意到flip定义中对curry的调用。还有一个问题:f=lambda{x,y{x,y]}g=f.flip.(1)pg.(2)#=>[1,2]我期望[2,1]。我不明白为什么。
# 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 }