2012-12-20 11 views
6

हास्केल के प्रस्तावना एक उपयोगी समारोह है कि एक समारोह के तर्कों स्वैप है लागू करने के लिए की जरूरत है। एक कस्टम विधि को परिभाषित करने के बजाय, मैं बंदर Proc कक्षा को पैच करना चाहता हूं ताकि मैं flipProc#curry के साथ उपयोग कर सकूं।प्रोक के लिए हास्केल के फ्लिप

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

y के लिए मूल्य की आपूर्ति करने के लिए कुछ।

मुझे नहीं पता कि Proc कक्षा को फिर से खोलने के लिए कैसे करें।

+0

मैं 'curry' बिट के बारे में उलझन में हूँ, वे मामलों orthogonal नहीं हैं? आप एक 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

यह अकोन्सू के लिए क्या पूछ रहा है के लिए यह सही लगता है। –

+0

हाँ, मुझे ऐसा लगता है। मैं रूबी में एक नौसिखिया हूँ। धन्यवाद। – 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

धन्यवाद। मैं ऐसा कुछ करने के बारे में सोच रहा था। यह दुर्भाग्य से प्रो # करी और आंशिक अनुप्रयोग के साथ काम नहीं करता है। – akonsu

+0

मुझे लगता है कि इसे अभी काम करना चाहिए, मैंने एक करीबी और फ़्लिप वाली प्रो के साथ उदाहरण अपडेट किया। – Matt

+0

मैंने plus.flip.curry ['a'] की कोशिश की और यह ऐसा नहीं कर सकता। – akonsu

संबंधित मुद्दे