2012-12-20 10 views
6

Prelude Haskell zawiera użyteczną funkcję, która swapy arguments funkcji: http://zvon.org/other/haskell/Outputprelude/flip_f.htmlpotrzeba wdrożenia klapki Haskell dla Proc

muszę zrobić to samo w Ruby. Zamiast definiować niestandardową metodę, chciałabym przerobić klasę Proc tak, abym mógł używać flip obok Proc#curry. Coś jak

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

dostarczyć wartość dla y.

Nie wiem, jak otworzyć ponownie klasę Proc, aby to zrobić.

+0

Jestem mylić o 'curry' bit, nie są one ortogonalne spraw? możesz spróbować odwrócić argumenty proc, bez względu na to, czy chcesz je później, czy nie. – tokland

+0

jest to poprawne. curry i flip są niezależne. – akonsu

Odpowiedz

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

Wydaje się to słuszne, o co pyta akonsu. –

+0

tak, tak myślę. Jestem początkującym w Ruby. dzięki. – 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" 

Aktualizacja:

# 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

dzięki. Myślałem, że mam coś takiego. To nie działa niestety w przypadku curry ProC# i częściowej aplikacji. – akonsu

+0

Myślę, że to powinno teraz działać, zaktualizowałem ten przykład procem z curry-and-flip. – Matt

+0

Próbowałem plus.flip.curry ["a"] i nie może tego zrobić. – akonsu