2012-12-20 24 views
6

Haskell'ın Prelude bir işlevin argümanları swapları yararlı bir işlevi vardır uygulamak gerekir. Özel bir yöntemi tanımlamak yerine, Proc sınıfına yama yüklemek istiyorum, böylece Proc#curry ile birlikte flip kullanabilirsiniz. y için bir değer sağlamak üzereProc için Haskell'ın çevirme

gibi bir şey.

Bunu yapmak için Proc sınıfını nasıl yeniden açacağımı bilmiyorum.

+0

Onların meseleleri ortogonal değildir, 'curry' biti hakkında karıştı? Bir procun argümanlarını köreltmek isteyip istemediğinizi veya daha sonra değil, tersine çevirmeyi deneyebilirsiniz. – tokland

+0

bu doğru. körleme ve çevirme bağımsızdır. – akonsu

cevap

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

Bu akonsu'nun sorduğu şey için doğru görünüyor. –

+0

evet, öyle düşünüyorum. Ben Ruby'de yeni başlayan biriyim. Teşekkürler. – 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" 

Güncelleme:

# 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

teşekkürler. Böyle bir şey düşünmeyi düşünüyordum. Bu ne yazık ki ProC# köri ve kısmi uygulama ile çalışmıyor. – akonsu

+0

Şimdi çalışmalıyım diye düşünüyorum, örneği curried-ve-flipped proc ile güncelledim. – Matt

+0

Ben plus.flip.curry ['a'] çalıştım ve bunu yapamaz. – akonsu