2010-12-06 8 views
6
से Data.Map वापस जाने के लिए

इस समारोह काम करता है:कैसे समारोह

serialExpansion num = Map.fromList (zip (listOfSimpleDividers num) (powers num)) 

लेकिन जब मैं बांधने:

simplifier.hs:46:26: Not in scope: type constructor or class `Map' 

मैं कैसे घोषित करना चाहिए:

serialExpansion :: Int -> Map 
serialExpansion num = Map.fromList (zip (listOfSimpleDividers num) (powers num)) 

मैं त्रुटि मिलती है कार्यक्रम?

उत्तर

12

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 के सही रिटर्न प्रकार को बताने में सक्षम थे, तो संकलक क्यों नहीं हो सकता?" यह। यही कारण है कि आपका पहला उदाहरण काम करता था। चूंकि आपने टाइप हस्ताक्षर छोड़ा है, इसलिए संकलक ने इसे संदर्भ से अनुमानित किया है। जैसा कि आपने अभी अनुभव किया है, लेखन प्रकार हस्ताक्षर यह सुनिश्चित करने का एक अच्छा तरीका हो सकता है कि आप अपने कोड को पूरी तरह से समझें (प्रकार अनुमान पर भरोसा करने के बजाय)।

+0

अंतिम अनुच्छेद कुंजी-बिंदु है! +1 – fuz

+2

पैरामैट्रिज्ड डेटा प्रकार (जिसे एक सार डेटा प्रकार भी कहा जाता है) - "parametrized" और "abstract" कोई समान नहीं हैं। वे स्वतंत्र अवधारणाएं हैं - एक डेटा प्रकार या तो दोनों हो सकता है। – timbod

7

दो अंक GSPR के जवाब के पूरक के लिए:

import Data.Map (Map) 
import qualified Data.Map as Map 

यह आपको Map.Map लेखन से बचने के लिए अनुमति देता है:

यह प्रकार निर्माता Map अयोग्य आयात और फिर मॉड्यूल के बाकी योग्य आयात करने के लिए एक आम बात है हर जगह अपने प्रकार के हस्ताक्षर में।

इसके अलावा, या तो जीएचसीआई या हग्स में आप किसी भी फ़ंक्शन के अनुमानित प्रकार के लिए इंटरैक्टिव वातावरण से पूछने के लिए :t का उपयोग कर सकते हैं। उदाहरण के लिए, अगर मैं GHCi में इस फ़ाइल को लोड:

import Data.Map (Map) 
import qualified Data.Map as Map 

serialExpansion num = Map.fromList (zip (listOfSimpleDividers num) (powers num)) 
    where 
    powers = undefined 
    listOfSimpleDividers = undefined 

मैं निम्नलिखित:

*Main> :t serialExpansion 
serialExpansion :: (Ord k) => t -> Map k a 

आप powers की अपनी परिभाषा में प्लग और listOfSimpleDividers आप एक अधिक विशिष्ट प्रकार प्राप्त करेंगे।

0

मैं बस इसमें कुछ भी नहीं मिला और फिर इसे अधिक लचीला तरीके से जोड़ना चाहता था।

यदि आप कुछ ऐसा करना चाहते हैं तो आपको Map.empty (मान लीजिए कि आपने इसे योग्यता आयात की है) की आवश्यकता है।

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