2012-12-20 19 views
6

Prelude Haskell ha una funzione utile che scambia argomenti di una funzione: http://zvon.org/other/haskell/Outputprelude/flip_f.htmldevono attuare vibrazione Haskell per Proc

devo fare lo stesso in rubino. Invece di limitarmi a definire un metodo personalizzato, mi piacerebbe eseguire il patch delle scimmie sulla classe Proc in modo da poter utilizzare flip insieme a Proc#curry. Qualcosa come

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

fornire un valore per .

Non so come riaprire la classe Proc per farlo.

+0

Sono confuso sul bit 'curry', non sono loro ortogonali questioni? puoi provare a capovolgere gli argomenti di un proc a prescindere che tu voglia curry o no dopo. – tokland

+0

questo è corretto. currying e flip sono indipendenti. – akonsu

risposta

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

Questo sembra giusto per quello che akonsu sta chiedendo. –

+0

si, penso di si. Sono un principiante in Ruby. Grazie. – 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" 

Aggiornamento:

# 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

grazie. Stavo pensando di avere qualcosa di simile. Questo non funziona con ProC# curry e l'applicazione parziale purtroppo. – akonsu

+0

Penso che dovrebbe funzionare ora, ho aggiornato l'esempio con un proc frick-and-flipped. – Matt

+0

Ho provato plus.flip.curry ['a'] e non ce l'ho fatta. – akonsu

Problemi correlati