2010-08-11 11 views
13

अगर मैं एक समारोह है:क्यों currying और स्केला में निहित नहीं uncurrying है

f : A => B => C 

मैं एक अंतर्निहित रूपांतरण ऐसी है कि यह जहां एक समारोह (A, B) => C की उम्मीद है इस्तेमाल किया जा सकता परिभाषित कर सकते हैं। यह दूसरी दिशा में भी जाता है।

इन रूपांतरणों को निहित (या स्पष्ट रूप से उपलब्ध नहीं) क्यों हैं? मुझे लगता है कि बुरी चीजों के कुछ मूल्यों के लिए खराब चीजें हो सकती हैं। यह क्या मूल्य है?

उत्तर

12

मुझे नहीं लगता कि कुछ भी बुरा होगा। रूपांतरण पूरी तरह से स्पष्ट है। सबसे खराब मामला, स्कैला यह समझने में सक्षम नहीं होगा कि निहित रूपांतरण लागू होता है।

implicit def curryImplicitly[A,B,C](f: (A, B) => C) = 
    (a: A) => (b: B) => f(a, b) 
implicit def uncurryImplicitly[A,B,C](f: A => B => C) = 
    (a: A, b: B) => f(a)(b) 

फिर फिर, यह भी सहायक होगा।

implicit def flipImplicitly[A,B,C](f: (A, B) => C) = 
    (b: B, a: A) => f(a, b) 
implicit def flipImplicitlyCurried[A,B,C](f: A => B => C) = 
    (b: B) => (a: A) => f(a)(b) 

लेकिन उन ताकि आप इन की जरूरत है, सकर्मक नहीं हैं:

implicit def flipAndCurry[A,B,C](f: (A, B) => C) = 
    (b: B) => (a: A) => f(a, b) 
implicit def flipAndUncurry[A,B,C](f: A => B => C) = 
    (b: B, a: A) => f(a)(b) 

लेकिन अब रूपांतरण अस्पष्ट है। तो यह सभी गुलाब नहीं है।

चलिए जानते हैं कि यह अभ्यास में कैसे काम करता है। आपको फंक्शन 3, फंक्शन 4, आदि के लिए समकक्षों की आवश्यकता हो सकती है।

+0

मैंने 2.8 में इसके साथ नहीं खेला है, लेकिन मैंने 2.7.एक्स के अंधेरे दिनों में इसे वापस करने की कोशिश की और यह इंफ्रेंसर आईआईआरसी प्रकार में कंपाइलर दुर्घटनाओं का कारण बन गया। चीजों ने उस मोर्चे पर एक उचित बिट में सुधार किया है, तो शायद यह सब अच्छा है ... –

+0

हाँ, अगर आप इसे उच्च प्रकार के प्रकार का अनुमान लगाने की कोशिश करते हैं तो अभी भी संकलक को क्रैश करना बहुत आसान है, लेकिन यह एक बड़ा सुधार है 2.7। – Apocalisp

+0

मैंने साधारण मामलों के लिए 2.8 में इन्हें आजमाया, और सब ठीक हो गया। – thSoft

8

आप उन्हें डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से उपलब्ध नहीं करना चाहते हैं (हमेशा चालू) क्योंकि तब सिस्टम सिस्टम को आपकी मदद करने में परेशानी होती है जब आपने गुच्छा के तर्कों के साथ अधिभारित किया है समान प्रकार:

A => B => C 
D => C  // D is allowed to be a tuple (A,B)... 

(A,B) => C // If I have this, to whom should I convert? 

मजबूत टाइपिंग का लाभ का एक हिस्सा आपको चेतावनी जब आप कुछ मूर्ख किया है है। चीजों को काम करने के लिए बहुत मेहनत करने से लाभ कम हो जाता है। यहां, यदि रूपांतरण स्वचालित रूप से किए गए थे, तो हो सकता है कि आप जिस विधि को कॉल करना चाहते हैं उसे कॉल न करें।

अनुरोध पर पूरी तरह से उपलब्ध होने के बाद यह ठीक है, लेकिन अगर आपको इसकी आवश्यकता हो तो इसे स्वयं करना मुश्किल नहीं है। यह ऐसा कुछ है जिसे मैं शायद ही कभी उपयोग करता हूं; मैं इसे अपने शीर्ष दस या शायद शीर्ष सौ चीजों में भी नहीं रखूंगा जो मुझे लाइब्रेरी में पसंद है (कुछ हद तक क्योंकि मैं स्वत: करी/अनिश्चितता के बजाय एक टुपल में स्वचालित रूपांतरण पसंद कर सकता हूं)।

+4

ध्यान दें कि आप तर्क 'ए => बी => सी' और 'डी => सी' के साथ एक फ़ंक्शन को अधिभारित करने में सक्षम नहीं होंगे, क्योंकि उनके पास एक ही मिटा है। तो समस्या इस तरह से अभ्यास में नहीं आएगी। – Apocalisp

+0

आह, ठीक है आप हैं। यदि आप अलग-अलग विधि नामों का उपयोग करते हैं लेकिन विधि का नाम गलत प्राप्त करते हैं, तो यह दोबारा जांच के रूप में टाइप हस्ताक्षर होने में सहायक हो सकता है। –

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