2012-12-20 4 views
6

하스켈의 서곡이 함수의 인수를 스왑 유용한 기능을 가지고를 구현해야합니다. 사용자 지정 메서드를 정의하는 대신 Proc 클래스에 원숭이 패치를 적용하여 flipProc#curry을 사용할 수 있습니다. 예 :는 PROC에 대한 하스켈의 플립

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

y 값을 제공하십시오.

나는 그것을 수행하기 위해 Proc 클래스를 다시 여는 방법을 모른다.

+0

나는 그들이 문제를 직교하지의'curry' 비트에 대해 혼란 스러워요? 당신은 당신이 카레를 만들고 싶어 할지라도 proc의 논쟁을 뒤집어 쓸 수 있습니다. – tokland

+0

정확합니다. 카레와 뒤집기는 독립적입니다. – akonsu

답변

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

이것은 akonsu가 요구하는 것처럼 보입니다. –

+0

네, 그렇게 생각합니다. 저는 Ruby 초심자입니다. 감사. 덕분에 – 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" 

업데이트 :

# 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

. 이런 식으로 생각했습니다. 이것은 ProC# curry 및 부분적으로는 불행히도 작동하지 않습니다. – akonsu

+0

이제는 제대로 작동해야한다고 생각합니다. 예제를 카레 앤 플립 된 proc으로 업데이트했습니다. – Matt

+0

나는 플러스를 시도했다 .flip.curry [ 'a'] 그리고 그것을 할 수 없다. – akonsu