2012-12-20 11 views
6

Haskells Prelude hat eine nützliche Funktion zu implementieren, die eine Funktion Argumente austauscht: http://zvon.org/other/haskell/Outputprelude/flip_f.htmlbenötigen Haskells Flip für Proc

Ich brauche das gleiche in Ruby zu tun. Anstatt nur eine benutzerdefinierte Methode zu definieren, möchte ich die Klasse Proc mit einem Patch versehen, so dass ich flip neben Proc#curry verwenden kann. Etwas wie

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

, um einen Wert für y zu liefern.

Ich weiß nicht, wie Proc Klasse, um das zu tun wieder zu öffnen.

+0

Ich bin verwirrt über die 'curry' bit, sind nicht diese Bereiche betreffen, die orthogonal? Sie können versuchen, die Argumente eines Procs zu spiegeln, unabhängig davon, ob Sie es anschließend curren wollen oder nicht. – tokland

+0

das ist richtig. Curry und Flip sind unabhängig. – akonsu

Antwort

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] 
+0

Das scheint genau das zu sein, wonach akonsu fragt. –

+0

ja, ich denke schon. Ich bin ein Anfänger in Ruby. Vielen Dank. – akonsu

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" 

Update:

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

danke. Ich dachte daran, so etwas zu haben. Dies funktioniert leider nicht mit ProC# curry und Teilapplikation. – akonsu

+0

Ich denke, es sollte jetzt funktionieren, ich habe das Beispiel mit einem Curry-und-Flipped-Proc aktualisiert. – Matt

+0

Ich habe versucht, plus.flip.curry ['a'] und es kann es nicht tun. – akonsu