2014-09-21 8 views
9

में लक्षण के उद्देश्य बनाम मुझे यह समझाया गया स्काला में लक्षण बनाम हास्केल में प्रकार कक्षाओं के बारे में सोचने के लिए कैसे कोशिश कर रहा हूँ।हास्केल में प्रकार वर्गों के उद्देश्य स्काला

मेरी समझ यह है कि टाइप क्लास मुख्य रूप से हास्केल में संकलित समय पर महत्वपूर्ण हैं और रनटाइम पर नहीं, दूसरी तरफ स्कैला में लक्षण जटिल समय और रन टाइम दोनों में महत्वपूर्ण हैं। मैं इस विचार को एक साधारण उदाहरण के साथ चित्रित करना चाहता हूं, और मैं जानना चाहता हूं कि मेरा यह दृष्टिकोण सही है या नहीं।

पहले, हमें हास्केल में टाइप वर्गों पर विचार करते हैं:

के एक सरल उदाहरण लेते हैं। प्रकार वर्ग Eq

उदाहरण के लिए, Int और CharEq दोनों उदाहरण हैं। तो यह एक बहुरूपी List भी Eq का एक उदाहरण है कि बनाने के लिए संभव है और या तो Int या Char रों लेकिन दोनों नहीं हो सकते हैं एक ही सूची में।

मेरा प्रश्न है: यही कारण है कि हास्केल में कक्षाएं क्यों मौजूद हैं?

दूसरे शब्दों में एक ही प्रश्न:

प्रकार कक्षाएं बहुरूपी प्रकार बनाने के लिए है कि आपरेशन कि किसी दिए गए प्रकार कक्षा में परिभाषित कर रहे हैं (समर्थन इस उदाहरण आपरेशन == में परिभाषित में (इस उदाहरण एक बहुरूपी List में) सक्षम टाइप क्लास Eq) लेकिन मेरी समझ के अनुसार, अस्तित्व के लिए यही उनका एकमात्र कारण है। क्या यह मेरी सही समझ है?

क्या कोई अन्य कारण है कि कक्षाएं मानक (मानक) हास्केल में क्यों मौजूद हैं?

क्या कोई अन्य उपयोग केस है जिसमें मानक हास्केल में किस प्रकार के वर्ग उपयोगी हैं? मुझे कोई नहीं लगता है।

चूंकि हास्केल की सूची एकरूप हैं, इसलिए Char और Int को उसी सूची में रखना संभव नहीं है। तो मेरी समझ के अनुसार, प्रकार कक्षाओं की उपयोगिता संकलन समय पर समाप्त हो गई है। क्या यह मेरी सही समझ है?

अब, चलो स्काला में अनुरूप सूची उदाहरण पर विचार करें:

चलें उस पर एक equals विधि के साथ एक विशेषता Eq परिभाषित करते हैं। अब Char और Int विशेषता Eq को लागू करें। एक ही सूची में तत्वों के विभिन्न प्रकार डाल - -

अब यह स्काला कि एक ही सूची में दोनोंChar और Int रों स्वीकार करता है में एक List[Eq] बनाने के लिए (ध्यान दें कि यह संभव है हास्केल संभव नहीं है, कम से कम मानक Haskell 98 में एक्सटेंशन के बिना नहीं)!

हास्केल की सूची के मामले में, प्रकार वर्गों के अस्तित्व मेरी समझ के अनुसार महत्वपूर्ण/उपयोगी केवल प्रकार संकलन समय पर जाँच के लिए है।

इसके विपरीत, स्काला में लक्षण के अस्तित्व महत्वपूर्ण दोनों प्रकार की जाँच के लिए और सूची में वस्तु के वास्तविक क्रम प्रकार पर बहुरूपी प्रेषण के लिए रन प्रकार पर संकलन समय पर जब समानता के लिए दो सूचियाँ की तुलना है।

/इस्तेमाल किया

तो, यह सरल उदाहरण के आधार पर, मैं निष्कर्ष कि हास्केल में प्रकार कक्षाएं मुख्य रूप से महत्वपूर्ण हैं के लिए आया था/संकलन समय में इस्तेमाल किया, इसके विपरीत, स्काला के लक्षण महत्वपूर्ण हैं संकलन समय और रन पर दोनों पहर।

क्या मेरा यह निष्कर्ष सही है?

यदि नहीं, तो क्यों नहीं?

संपादित करें:

n.m. की टिप्पणी के जवाब में

स्काला कोड:

case class MyInt(i:Int) { 
    override def equals(b:Any)= i == b.asInstanceOf[MyInt].i 
} 

case class MyChar(c:Char) { 
    override def equals(a:Any)= c==a.asInstanceOf[MyChar].c 
} 


object Test { 
    def main(args: Array[String]) { 
    val l1 = List(MyInt(1), MyInt(2), MyChar('a'), MyChar('b')) 
    val l2 = List(MyInt(1), MyInt(2), MyChar('a'), MyChar('b')) 
    val l3 = List(MyInt(1), MyInt(2), MyChar('a'), MyChar('c')) 
    println(l1==l1) 
    println(l1==l3) 
    } 
} 

यह प्रिंट:

true 
false 
+0

बस एक नोट, आपके उपयोग के मामले में लक्षण उपयोगी हैं, लेकिन आप इसके लिए अमूर्त कक्षाओं का भी उपयोग कर सकते हैं, लक्षणों का प्राथमिक उपयोग __mixin- विरासत पर संरचना है, क्योंकि हीरा की समस्या के कारण आप एकाधिक नहीं हो सकते विरासत, लेकिन आप कार्यक्षमता को विभाजित करने और गुणों को पुन: प्रयोज्यता प्राप्त करने के कई गुण प्राप्त कर सकते हैं, आप कुछ वर्गों के साथ समाप्त होते हैं जो व्यवहार को कई गुणों के रूप में प्राप्त करते हैं। –

+0

आप कुछ ही बार कुछ बिंदु दोहराते हैं ... –

+0

मुझे पता है, लेकिन मैं जितना संभव हो उतना स्पष्ट होने की कोशिश करता हूं, मुझे खेद है कि दोहराव पाठ को थोड़ा सा बनाता है .... उबाऊ? – jhegedus

उत्तर

9

मैं हास्केल पक्ष पर टिप्पणी करेंगे।

प्रकार कक्षाएं हास्केल, में बहुरूपता लाने प्रतिबंधित जिसमें एक प्रकार चर a अभी भी सार्वभौमिक मात्रा निर्धारित किया जा सकता है, लेकिन केवल सभी प्रकार के एक सबसेट से अधिक पर्वतमाला - अर्थात्, प्रकार कौन-प्रकार वर्ग का एक उदाहरण है उपलब्ध।

क्यों प्रतिबंधित बहुलकवाद उपयोगी है? एक अच्छा उदाहरण समानता ऑपरेटर

(==) :: ????? 

इसका प्रकार क्या होना चाहिए? Intuitively, यह ही प्रकार के दो मानों का उपयोग करके एक बूलियन देता है, तो:

(==) :: a -> a -> Bool   -- (1) 

लेकिन टाइपिंग ऊपर पूरी तरह से ईमानदार है, क्योंकि यह एक किसी भी प्रकार a को == लागू करने के लिए अनुमति देता है समारोह प्रकार सहित नहीं है, !

(\x :: Integer -> x + x) == (\x :: Integer -> 2*x) 

ऊपर चल सके कि (1)(==) के लिए टाइपिंग थे प्रकार से होकर गुजरेगा, के बाद से दोनों बहस में एक ही प्रकार a = (Integer -> Integer) के हैं। हालांकि, हम दो कार्यों की प्रभावी ढंग से तुलना नहीं कर सकते: प्रसिद्ध कंप्यूटेबिलिटी परिणाम हमें बताते हैं कि सामान्य रूप से ऐसा करने के लिए कोई एल्गोरिदम नहीं होता है।

तो, हम (==) को लागू करने के लिए क्या कर सकते हैं?

विकल्प 1: रन टाइम पर एक समारोह (या किसी भी अन्य कार्यों से जुड़े मूल्य - जैसे कार्यों की एक सूची के रूप में) यदि (==) को पास करने की पाया जाता है, एक अपवाद बढ़ा। यह वही है उदा। एमएल करता है। संकलित समय पर जांच प्रकारों के बावजूद टाइप किए गए प्रोग्राम अब "गलत हो सकते हैं"।

विकल्प 2: एक नए प्रकार के पॉलीमोर्फिज्म को पेश करें, a को फ़ंक्शन-फ्री प्रकारों पर प्रतिबंधित करें।उदाहरण के लिए, ww (==) :: forall-non-fun a. a -> a -> Bool हो सकता है ताकि कार्यों की तुलना किसी प्रकार की त्रुटि से उत्पन्न हो। हास्केल वास्तव में प्राप्त करने के लिए प्रकार कक्षाओं का शोषण करता है।

तो, हास्केल प्रकार कक्षाएं (==) "ईमानदारी से" टाइप करने की अनुमति देती हैं, रन समय पर कोई त्रुटि सुनिश्चित नहीं करती हैं, और अत्यधिक प्रतिबंधक होने के बिना। बेशक, प्रकार की कक्षाओं की शक्ति उस से बहुत दूर है, लेकिन कम से कम मेरे अपने विचार में, वे प्राथमिक उद्देश्य प्रतिबंधित पॉलिमॉर्फिज्म को बहुत सामान्य और लचीला तरीके से अनुमति देना है। दरअसल, टाइप क्लास के साथ प्रोग्रामर सार्वभौमिक प्रकार की मात्राओं पर अपने स्वयं के प्रतिबंध परिभाषित कर सकता है।

+0

निम्नलिखित वाक्य से आपका क्या मतलब था। "उपर्युक्त टाइप करेगा यदि (1) टाइपिंग (==) के लिए टाइपिंग थे, क्योंकि दोनों तर्क एक ही प्रकार के हैं = (इंटीजर -> इंटीजर)।" – jhegedus

+0

@jhegedus मेरा मतलब है कि उपरोक्त समानता प्रकार की जांच पास करेगी: दोनों तर्क एक ही प्रकार के हैं 'ए = इंटीजर-> इंटेगर', इसलिए '(==)' के लिए पॉलीमोर्फिक प्रकार को 'ए' के ​​साथ तत्काल किया जा सकता है। – chi

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