2014-09-15 14 views
5

मैं विभिन्न ब्लॉग पढ़ने और प्रवाह के उत्तरों पर ढेर करके करी को समझने की कोशिश कर रहा हूं और मुझे लगता है कि मैं कुछ समझ गया। हास्केल में, हर समारोह curried है, इसका मतलब है, जब आप एक समारोह
f x y = x + y
की तरह यह वास्तव में
((f x) y)
इस में है, समारोह शुरू में पैरामीटर के रूप में पहले पैरामीटर 'एक्स' ले और आंशिक रूप से यह लागू होता है कार्य करने के लिए एफ जो बदले में वाई के लिए एक समारोह देता है। जहां यह केवल वाई एक पैरामीटर लेता है और फ़ंक्शन को लागू करता है। दोनों मामलों में फ़ंक्शन केवल एक पैरामीटर लेता है और एकल पैरामीटर लेने के लिए फ़ंक्शन को कम करने की प्रक्रिया को 'करीइंग' कहा जाता है। अगर मेरी समझ यहां गलत है तो मुझे सही करें।
तो यदि यह सही है, तो क्या आप कृपया मुझे बता सकते हैं कि क्या कार्य 'दो' और 'तीन' करीबी कार्य हैं?
क्या निम्नलिखित कोड वास्तव में हैकेल में घुमा रहा है?

three x y z = x + y + z 
two = three 1 
same = two 1 

इस मामले में, मैं दो विशेष कार्य है, 'दो' और 'एक ही' जो केवल एक पैरामीटर लेने के लिए कम हो जाता है तो यह curried है?

+2

जीएचसीआई में ': t' कमांड का उपयोग करके आप इसे स्वयं परीक्षण कर सकते हैं (': टी तीन' 'तीन' के प्रकार को प्रदर्शित करेगा)। – Mephy

+0

महान, उसे नहीं पता था। धन्यवाद। – Nair

+0

@ जोशुआहन्ना - शायद आप इसे यहां देखेंगे। मुझे यकीन है कि कोई जवाब नहीं था या आपके जवाब को हटाने के लिए - मुझे उम्मीद थी कि आप नायर के लिए थोड़ी उपयोगी जानकारी जोड़ देंगे - क्षमा करें आदमी – Carsten

उत्तर

4

चलिए पहले two देखें। यह

two :: Num a => a -> a -> a 

की एक हस्ताक्षर भूल अब के लिए Num a है (यह a पर केवल एक बाधा है - आप Int यहाँ पढ़ सकते हैं)। निश्चित रूप से यह भी एक करीबी समारोह है।

अगले एक और दिलचस्प है:

same :: Num a => a -> a 

(Btw: अच्छा नाम है - यह ही है, लेकिन वास्तव में नहीं आईडी ^^)

TBH: मैं डॉन निश्चित रूप से पता नहीं है।

सबसे अच्छी परिभाषा मैं एक curried समारोह के बारे में पता यह है:

एक curried समारोह (एन -1) तर्कों की एक और समारोह लौटने एन तर्क के एक समारोह है।

(अगर आप चाहते हैं आप पूरी तरह से निश्चित रूप से curried कार्यों के लिए किस हद तक कर सकते हैं इस)

यह केवल फिट होगा यदि आप 0 मानकों के साथ कार्यों के रूप में स्थिरांक को परिभाषित - जो आप निश्चित रूप से कर सकते हैं। तो मैं कहूंगा कि हाँ (?) यह भी एक curried समारोह लेकिन केवल एक mathy में सीमा रेखा तरीका है (0 संख्याओं का योग परिभाषित किया गया है की तरह बनना 0)

1

आपको लगता है कि three सोच सकता है अज्ञात कार्यों के साथ कार्य है:

three = \x -> (\y -> (\z -> x + y + z))) 
4

सर्वश्रेष्ठ इस समीकरण के बारे में सोचें।निम्नलिखित सभी समकक्ष परिभाषाएं हैं:

f x  y  z = x+y+z 
f x  y = \z -> x+y+z 
f x = \y -> (\z -> x+y+z) 
f = \x -> (\y -> (\z -> x+y+z)) 

आंशिक आवेदन केवल यहां प्रासंगिक रूप से प्रासंगिक है। अक्सर आप वास्तविक आंशिक अनुप्रयोग नहीं करना चाहते हैं और वास्तविक लैम्ब्डा ऑब्जेक्ट को स्मृति में बनाया जाना चाहिए - उम्मीद है कि संकलक नियोजित करेगा - और बेहतर अनुकूलित करें - पूर्ण आवेदन के अंतिम बिंदु पर पूर्ण परिभाषा।

कार्यों की उपस्थिति curry/uncurry अभी तक एक और भ्रमित मुद्दा है। f (x,y) = ... और f x y = ... दोनों हास्केल में curried कर रहे हैं, ज़ाहिर है, लेकिन हमारे सिर में हम करते हैं के बारे में दो तर्क के एक समारोह के रूप में पहली लगता है, इसलिए कार्यों दो रूपों के बीच अनुवाद curry और uncurry, एक के रूप में नामित कर रहे हैं स्मरक।

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