2010-11-24 8 views
11
में सरल Currying

मैं रूबी में कुछ currying करने के लिए कोशिश कर रहा हूँ:रूबी

def add(a,b) 
    return a+b 
end 

plus = lambda {add} 
curry_plus = plus.curry 
plus_two = curry_plus[2] #Line 24 
puts plus_two[3] 

मैं त्रुटि

func_test.rb:24:in `[]': wrong number of arguments (1 for 0) (ArgumentError) 
func_test.rb से

: 24: '

`में लेकिन अगर मैं

plus = lambda {|a,b| a+ b} 

कर यह काम करने के लिए लगता है। लेकिन लैम्ब्डा के साथ असाइन करने के बाद प्लस प्रिंट करके दोनों तरीकों से एक ही प्रकार की वस्तु वापस आती है। मैंने क्या गलत समझा है?

उत्तर

9
lambda {|a,b| a+ b} 

एक लैम्ब्डा जो दो तर्क लेता है और पहली पर + बुला, अपने तर्कों के रूप में दूसरे के साथ का परिणाम देता है बनाता है।

lambda {add} 

एक लैम्ब्डा, जो कोई तर्क लेता है और तर्क के बिना add कॉल जो निश्चित रूप से एक त्रुटि है बनाता है।

आप क्या चाहते हैं, आपको क्या करना चाहिए ऐसा करने के लिए

plus = lambda {|x,y| add(x,y)} 

या

plus = method(:add).to_proc 
+1

': add.to_proc' सही काम नहीं करेगा। यह 'proc {| रिसीवर, * args | के बराबर एक प्रक्रिया देता है receiver.add (* args)} '। जिसका अर्थ है कि 'add.to_proc [1,2] 'self.add (1,2)' के बजाय '1.add (2)' को कॉल करने का प्रयास करेगा। – Chuck

+0

@ चक: ठीक है, मेरा बुरा। – sepp2k

+0

यह सब अब समझ में आता है, धन्यवाद sepp2k! – MattyW

4

जब आप lambda {add} लिखते हैं, आप एक प्रोक है कि कोई तर्क लेता है और अपने एकल कार्रवाई के रूप में, कॉल तर्क के साथ add घोषणा कर रहे। यह एक प्रक्रिया में add नहीं बदलता है। दूसरी ओर, lambda {|a,b| a + b} एक प्रक्रिया देता है जो दो तर्क लेता है और उन्हें एक साथ जोड़ता है - चूंकि यह तर्क लेता है, इसलिए यह तर्क देने के लिए मान्य है।

मुझे लगता है कि क्या आप चाहते हैं method(:add).to_proc.curry है।

8

आप सही रास्ते पर कर रहे हैं:

add = ->(a, b) { a + b } 
plus_two = add.curry[2] 
plus_two[4] 
#> 6 
plus_two[5] 
#> 7 

के रूप में अन्य लोगों ने बताया है, plus आपके द्वारा परिभाषित लैम्ब्डा कोई तर्क नहीं लेता है और add विधि को कॉल करता है तर्क।