में लक्षण के उद्देश्य बनाम मुझे यह समझाया गया स्काला में लक्षण बनाम हास्केल में प्रकार कक्षाओं के बारे में सोचने के लिए कैसे कोशिश कर रहा हूँ।हास्केल में प्रकार वर्गों के उद्देश्य स्काला
मेरी समझ यह है कि टाइप क्लास मुख्य रूप से हास्केल में संकलित समय पर महत्वपूर्ण हैं और रनटाइम पर नहीं, दूसरी तरफ स्कैला में लक्षण जटिल समय और रन टाइम दोनों में महत्वपूर्ण हैं। मैं इस विचार को एक साधारण उदाहरण के साथ चित्रित करना चाहता हूं, और मैं जानना चाहता हूं कि मेरा यह दृष्टिकोण सही है या नहीं।
पहले, हमें हास्केल में टाइप वर्गों पर विचार करते हैं:
के एक सरल उदाहरण लेते हैं। प्रकार वर्ग Eq
।
उदाहरण के लिए, Int
और Char
Eq
दोनों उदाहरण हैं। तो यह एक बहुरूपी 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
बस एक नोट, आपके उपयोग के मामले में लक्षण उपयोगी हैं, लेकिन आप इसके लिए अमूर्त कक्षाओं का भी उपयोग कर सकते हैं, लक्षणों का प्राथमिक उपयोग __mixin- विरासत पर संरचना है, क्योंकि हीरा की समस्या के कारण आप एकाधिक नहीं हो सकते विरासत, लेकिन आप कार्यक्षमता को विभाजित करने और गुणों को पुन: प्रयोज्यता प्राप्त करने के कई गुण प्राप्त कर सकते हैं, आप कुछ वर्गों के साथ समाप्त होते हैं जो व्यवहार को कई गुणों के रूप में प्राप्त करते हैं। –
आप कुछ ही बार कुछ बिंदु दोहराते हैं ... –
मुझे पता है, लेकिन मैं जितना संभव हो उतना स्पष्ट होने की कोशिश करता हूं, मुझे खेद है कि दोहराव पाठ को थोड़ा सा बनाता है .... उबाऊ? – jhegedus