2010-01-31 3 views
36

मैं जीएचसीआई में निम्नलिखित करता हूं:हास्केल अस्पष्ट घटनाएं - कैसे बचें?

:m + Data.Map 
let map = fromList [(1, 2)] 
lookup 1 map 

जीएचसीआई जानता है कि नक्शा एक (मैप इंटीजर इंटीजर) है। तो जब यह टाइप स्पष्ट है और मैं इससे बच सकता हूं तो Prelude.lookup और Data.Map.lookup के बीच एक अस्पष्टता का दावा क्यों करता है?

<interactive>:1:0: 
    Ambiguous occurrence `lookup' 
    It could refer to either `Prelude.lookup', imported from Prelude 
          or `Data.Map.lookup', imported from Data.Map 

> :t map 
map :: Map Integer Integer 
> :t Prelude.lookup 
Prelude.lookup :: (Eq a) => a -> [(a, b)] -> Maybe b 
> :t Data.Map.lookup 
Data.Map.lookup :: (Ord k) => k -> Map k a -> Maybe a 

उत्तर

46

प्रकार स्पष्ट रूप से अलग हैं, लेकिन हास्केल नामों की तदर्थ ओवरलोडिंग की अनुमति नहीं है, इसलिए आप केवल एक lookup एक उपसर्ग के बिना इस्तेमाल किया जा करने के लिए चुन सकते हैं।

> import qualified Data.Map as Map 

तो आप कह सकते हैं

> lookup 1 [(1,2), (3,4)] 
Just 2 
> Map.lookup 1 Map.empty 
Nothing 

आमतौर पर, हास्केल पुस्तकालयों या तो फिर से का उपयोग कर किसी और प्रस्तावना से नाम, या फिर से उपयोग से बचने:

ठेठ समाधान Data.Map योग्य आयात करने के लिए है उनमें से एक पूरा गुच्छा। Data.Map दूसरे में से एक है, और लेखक उम्मीद करते हैं कि आप इसे योग्य आयात करें।

[संपादित करें ephemient की टिप्पणी शामिल करने के लिए]

आप उपसर्ग के बिना Data.Map.lookup का उपयोग करना चाहते हैं, तो आप Prelude.lookup को छिपाने के लिए है, क्योंकि यह परोक्ष अन्यथा आयातित है:

import Prelude hiding (lookup) 
import Data.Map (lookup) 

इसमें कुछ समय अजीब है लेकिन हो सकता है उपयोगी हो अगर आप Data.Map.lookup का उपयोग पूरे समूह में करते हैं और आपके डेटा संरचनाएं सभी मानचित्र हैं, कभी भी सूचीबद्ध नहीं होती हैं।

18

एक से थोड़ा अधिक सामान्य टिप्पणी पर, यह कुछ ऐसा है जो मुझे पहली बार में उलझन में है - तो, ​​मुझे दोहराना और कुछ पर जोर नाथन सैंडर्स जाने कहा:

हास्केल नामों की तदर्थ ओवरलोडिंग की अनुमति नहीं है

यह डिफ़ॉल्ट रूप से सच है, लेकिन पहले आश्चर्यजनक रूप से गैर-स्पष्ट प्रतीत होता है। हास्केल की अनुमति देता है polymorphic functions की दो शैलियों:

  • पैरामीट्रिक बहुरूपता है, जो एक समारोह एक संरचनात्मक रूप से समान, सार तरीके से मनमाना प्रकार पर संचालित करने के लिए अनुमति देता है
  • तदर्थ बहुरूपता है, जो एक समारोह संचालित करने के लिए अनुमति देता है एक संरचना की दृष्टि से अलग में प्रकार के एक परिभाषित सेट लेकिन हमें उम्मीद है कि अर्थ की दृष्टि से समान तरीके

पैरामीट्रिक बहुरूपता मानक है (और वरीय एक विकल्प दिया) हास्केल एक में दृष्टिकोण से किसी पर एनडी संबंधित भाषाओं; एड-हाॉक पॉलिमॉर्फिज्म अधिकांश अन्य भाषाओं में मानक है, जैसे कि "फंक्शन ओवरलोडिंग" नाम से जाना जाता है, और अक्सर उसी नाम के साथ कई कार्यों को लिखकर अभ्यास में लागू किया जाता है।

तदर्थ बहुरूपता प्रकार कक्षाएं, जो वर्ग की आवश्यकता द्वारा हास्केल में सक्षम किया गया है उसके संबंधित तदर्थ बहुरूपी कार्यों के सभी के साथ परिभाषित किया जाना है, और उदाहरणों को स्पष्ट रूप से अधिभार संकल्प द्वारा इस्तेमाल किया प्रकार के लिए घोषित किया जाना है।कार्य एक उदाहरण घोषणा के बाहर परिभाषित भले ही उनके प्रकार पर्याप्त अलग है कि एक संदर्भ स्पष्ट हो जाएगा, तदर्थ बहुरूपी कभी नहीं कर रहे हैं।

तो, जब समान नाम के साथ कई गैर प्रकार-दर्जे के प्रकार्य विभिन्न मॉड्यूल में परिभाषित कर रहे हैं, दोनों मॉड्यूल अयोग्य त्रुटियों में परिणाम होगा आयात कर अगर आप या तो फ़ंक्शन का उपयोग करने का प्रयास करें। Data.List, Data.Map, और Data.Set के संयोजन इस संबंध में विशेष रूप से विचित्र है, और क्योंकि Data.List के कुछ हिस्सों प्रस्तावना से निर्यात किया जाता है, मानक अभ्यास (के रूप में नाथन सैंडर्स कहते हैं) है हमेशा आयात करने के लिए अन्य लोगों के अर्हता प्राप्त की।

+0

यह मैं ढूंढा, +1 जवाब की तरह है। लेकिन मेरे पास एक सवाल बाकी है। फिर, इन सभी 'डेटा' सूची ',' Data.Set' आदि के लिए "कंटेनर" टाइपक्लास क्यों नहीं है? या यदि वहां है (और यदि मैं सही ढंग से समझता हूं, तो यह 'फंक्टर' टाइपक्लास है) - फिर, कंटेनर प्रकारों के लिए अपने उदाहरणों को परिभाषित करना पुस्तकालयों में सर्वव्यापी नहीं है? – ulidtko

+0

@ulidtko: संक्षिप्त उत्तर "क्योंकि यह तुलना में कठिन है", और लंबा जवाब एक टिप्पणी में फिट नहीं होगा। कंटेनर तत्व तत्वों पर कौन से संचालन और सीमाओं का समर्थन करते हैं, और सी में कई जटिलताओं को शामिल किया गया है। 'TypeFamilies 'एक्सटेंशन पर जानकारी देखें - कंटेनर एपीआई इसके लिए एक प्रेरक उदाहरण हैं। –

+3

यह @ulidtko आप के लिए दिलचस्प हो सकता है: http://hackage.haskell.org/packages/archive/classy-prelude/0.4.1/doc/html/ClassyPrelude.html –