2012-12-20 21 views
6

Prelude Haskell có một chức năng hữu ích mà giao dịch hoán đổi đối số của một hàm: http://zvon.org/other/haskell/Outputprelude/flip_f.htmlcần phải thực hiện lật Haskell cho Proc

tôi cần phải làm như vậy trong Ruby. Thay vì chỉ định nghĩa một phương thức tùy chỉnh, tôi muốn khỉ vá lớp Proc để tôi có thể sử dụng flip cùng với Proc#curry. Một cái gì đó như

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

để cung cấp giá trị cho y.

Tôi không biết cách mở lại Proc lớp học để làm điều đó.

+0

Tôi đang bối rối về sự 'chút curry', không phải là họ trực giao vấn đề? bạn có thể thử lật các đối số của một proc bất kể bạn muốn cà ri hay không sau đó. – tokland

+0

điều này là chính xác. currying và flip là độc lập. – akonsu

Trả lời

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

Điều này có vẻ đúng đối với những gì akonsu đang yêu cầu. –

+0

vâng, tôi nghĩ vậy. Tôi là người mới bắt đầu trong Ruby. cảm ơn. – 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" 

Cập nhật:

# 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

cảm ơn. Tôi đã suy nghĩ để có một cái gì đó như thế này. Điều này không làm việc với ProC# cà ri và một phần ứng dụng không may. – akonsu

+0

Tôi nghĩ rằng nó sẽ làm việc ngay bây giờ, tôi cập nhật các ví dụ với một proc bị quấy rối và lật. – Matt

+0

Tôi đã thử plus.flip.curry ['a'] và nó không thể làm điều đó. – akonsu

Các vấn đề liên quan