data structures - Choosing among alternatives in a Haskell algebraic datatype -


प्रकार एक्स के रूप में परिभाषित किया गया है:

  डेटा X = एक्स {sVal :: स्ट्रिंग} | मैं {iVal :: Int} | बी {bVal :: Bool}  

और मुझे int एक एक्स मान के अंदर, यदि कोई है, अन्यथा शून्य है

<पूर्व> रिटर्नआईंट :: एक्स - & gt; Int

मैं कैसे निर्धारित कर सकता हूं कि किस प्रकार का X तर्क returnInt है?

  

डेटा SomeType = X {myString :: String} | मैं {myInt :: int} | बी {myBool :: Bool}

इस परिभाषा में कोई एक्स, आई और बी प्रकार नहीं हैं I एक्स, आई और बी कन्स्ट्रक्टर जो टाइप की वैल्यू बनाते हैं सोमटाइप ध्यान दें कि जब आप उन प्रकार के कंसल्टेंट्स के साथ निर्मित किसी भी मूल्य का प्रकार है, तो आप क्या पूछते हैं, तो क्या होता है:

  * मेन & gt; : टी (आई 5) (आई 5) :: कुछ प्रकार * मुख्य & gt; : टी (बी झूठी) (बी झूठी) :: सोमटाइप  

वे उसी प्रकार से संबंधित हैं!

जिस प्रकार आप एक्स, आई और बी का उपयोग कर सकते हैं प्रकारों का निर्माण, आप प्रकार को विरूद्ध करने के लिए पैटर्न मिलान का उपयोग कर सकते हैं, जैसे ऊपर अन्य उत्तर में किया गया है:

  returnInt :: SomeType - & gt; Int returnInt (I x) = x - यदि पैटर्न से मेल खाता है (I एक्स) तो वापस एक्स returnInt_ = त्रुटि "मुझे एक पूर्णांक मान की आवश्यकता है, आप मूर्ख" - अन्यथा एक त्रुटि फेंक  
< P> बस याद रखें कि पैटर्न मिलान क्रम में होता है: यदि मूल्य कुछ पंक्ति में पैटर्न से मेल खाता है, तो नीचे दी गई रेखाओं का पैटर्न निष्पादित नहीं किया जाएगा।

ध्यान दें कि जब आप अपने प्रकार को परिभाषित करते हैं जैसे आपने किया था, उदाहरण के लिए, उदाहरण के लिए:

  को देखने के लिए कोशिश करो। * मुख्य & gt; : My mynt myInt :: SomeType - & gt; Int  

और यह फ़ंक्शन क्या करें:

  * मुख्य & gt; मेरेआईंट (आई 5) 5 * मुख्य & gt; MyInt (B False) *** अपवाद: रिकॉर्ड चयनकर्ता Main.myInt में कोई मैच नहीं  

यह निश्चित है कि returnInt ऊपर परिभाषित है अजीब त्रुटि संदेश केवल आपको बताता है कि फ़ंक्शन यह नहीं जानता कि किस प्रकार के कुछ सदस्य के साथ काम करना है जो कि (I x) से मेल नहीं खाता।

यदि आप अधिक सामान्य सिंटैक्स का उपयोग करके अपने प्रकार को परिभाषित करें:

  डेटा SomeType2 = X String | मैं इंट | बी बूल  

तब आप उन अच्छे रिकॉर्ड फ़ंक्शंस को खो देते हैं।

त्रुटि संदेश प्रोग्राम के निष्पादन को समाप्त कर देते हैं। यह कभी कभी परेशान है यदि आपको अपने कार्यों के लिए सुरक्षित व्यवहार की आवश्यकता है तो गबैकॉन का उत्तर केवल ऐसा करने का तरीका है शायद एक के बारे में जानें और इस प्रकार की गणना से निपटने के लिए इसका उपयोग करें जिसे कुछ मान वापस करने या कुछ भी वापस करने की आवश्यकता नहीं है (कोशिश करें:)।


Comments

Popular posts from this blog

iphone - How do I make a UIPickerView in a UIActionSheet -

excel - Populate list via a bi-Condition -