2012-04-12 13 views
7

मैं खिलौना (भौतिकी) वेक्टर लाइब्रेरी लिखने की प्रक्रिया में हूं और जीएचसी के साथ समस्याएं हैं जिनके कार्यों में Integer एस उनके प्रकार में होना चाहिए। मैं वैक्टर वैक्टर, साथ ही scalars (बस * का प्रयोग करके) गुणा करने के लिए चाहते हैं, और यह है, जबकि सिर्फ Vector उदाहरण Num होने मैं अब एक तरह से त्रुटियों हो रही द्वारा ही संभव था:हास्केल एक विशिष्ट प्रकार (स्पष्ट रूप से) असंगत रूप से क्यों अनुमान लगाएगा?

Couldn't match expected type `Integer' with actual type `Double' 

के साथ चारों ओर खेलने के बाद कोड आदेश समस्या नीचे पिन करने में मैं इस के लिए नीचे यह मिल गया है:

data V a = V a a a deriving (Show, Eq, Functor) 
scale a (V i j k) = V (a*i) (a*j) (a*k) 
(<.>) = scale 

अब अगर हम GHCi पूछने पर हम पाते हैं कि किस प्रकार ये हैं:

>:t scale 
scale :: Num a => a -> V a -> V a 
>:t (<.>) 
(<.>) :: Integer -> V Integer -> V Integer 

जहां हम निश्चित रूप से <.> नहीं चाहते हैं केवल Integer एस पर अभिनय करें। हालांकि यह <.> के लिए एक प्रकार हस्ताक्षर सहित यहां ठीक करने योग्य है, मैं जानना चाहता हूं कि वास्तव में क्या चल रहा है।

+0

संभावित डुप्लिकेट [मोनोमोर्फिज्म प्रतिबंध क्या है?] (Http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu

उत्तर

15

आप कुख्यात में भाग रहे हैं। एक अन्य समाधान स्पष्ट तर्क निर्दिष्ट करने के लिए होगा:

a <.> v = scale a v 

या -XNoMonomorphismRestriction pragma जोड़ें।

+0

तो बंद करें ... अगर केवल मेरे पास हास्केल कंपाइलर था तैयार: पी। –

+15

... या एक प्रकार हस्ताक्षर जोड़ें। सभी शीर्ष-स्तरीय कार्यों पर हस्ताक्षर टाइप करें, वैसे भी अच्छी शैली माना जाता है, इसलिए यह मोनोमोर्फिज्म प्रतिबंध-संबंधी मुद्दों से बचने का मेरा पसंदीदा तरीका है। – hammar

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