Map
एक पैरामीटरयुक्त डेटा प्रकार है (जिसे abstract data type भी कहा जाता है)। केवल तभी जब आप कुंजी के लिए एक प्रकार निर्दिष्ट करते हैं और मानों के लिए एक प्रकार निर्दिष्ट करते हैं, तो आपको पूर्ण परिभाषित प्रकार मिलता है।
उदाहरण के लिए, एक नक्शा जो आपको String
एस Integer
एस पर Map Integer String
टाइप करने देता है।
इसके अलावा, ऐसा लगता है कि आपने मानचित्र योग्य (जैसा आपको करना चाहिए) आयात किया है। इस वजह से, आपको हस्ताक्षर में केवल Map
के बजाय Map.Map
का उपयोग करना होगा।
इस प्रकार, अपने कार्य की तरह
serialExpansion :: Int -> Map.Map Key Value
एक हस्ताक्षर जहां Key
कुंजी डेटा प्रकार है और Value
मूल्य डेटा प्रकार है होना चाहिए। आपके मामले में, अगर मुझे अनुमान लगाना था, तो शायद आप Int
दोनों Key
और Value
दोनों के लिए चाहते हैं। सटीक होने के लिए: आप Key
सूची listOfSimpleDividers num
, और Value
में तत्वों के प्रकार के समान होने के लिए powers num
सूची में तत्वों के प्रकार के समान होना चाहते हैं। (यह अस्पष्ट है अगर Map.fromList
के प्रकार हस्ताक्षर का निरीक्षण करने में मदद कर सकता है)।
अब तक आप पूछ सकते हैं: "लेकिन यदि आप serialExpansion
के सही रिटर्न प्रकार को बताने में सक्षम थे, तो संकलक क्यों नहीं हो सकता?" यह। यही कारण है कि आपका पहला उदाहरण काम करता था। चूंकि आपने टाइप हस्ताक्षर छोड़ा है, इसलिए संकलक ने इसे संदर्भ से अनुमानित किया है। जैसा कि आपने अभी अनुभव किया है, लेखन प्रकार हस्ताक्षर यह सुनिश्चित करने का एक अच्छा तरीका हो सकता है कि आप अपने कोड को पूरी तरह से समझें (प्रकार अनुमान पर भरोसा करने के बजाय)।
अंतिम अनुच्छेद कुंजी-बिंदु है! +1 – fuz
पैरामैट्रिज्ड डेटा प्रकार (जिसे एक सार डेटा प्रकार भी कहा जाता है) - "parametrized" और "abstract" कोई समान नहीं हैं। वे स्वतंत्र अवधारणाएं हैं - एक डेटा प्रकार या तो दोनों हो सकता है। – timbod