2012-06-25 9 views
6

मैं निम्नलिखित कार्यक्रम hash_lookup.hs में एक साधारण हैश वृक्ष संरचना लिख ​​रहा हूँ में:हास्केल: कठिनाई संदर्भ embedding (Eq क) एक डेटा घोषणा

module Main where 

    data (Eq a) => HashTable a b = HashChildren (a, [HashTable a b]) | Hash (a, b) deriving (Show) 

    getKey :: HashTable a b -> a 

    getKey (HashChildren (k, hs)) = k 
    getKey (Hash (k, h)) = k 

    lookUp :: [a] -> HashTable a b -> Maybe (HashTable a b) 

    lookUp [] table = return table 
    lookUp _ (Hash _) = Nothing 
    lookUp (p:path) (HashChildren (_, ts)) = lookUp path (head (dropWhile (\x -> (getKey x) /= p) ts)) 

getKey एक दिया HashTable की जड़ कुंजी को पुनः प्राप्त करने का इरादा है , और लुकअप स्ट्रिंग्स की एक सूची लेता है और इसका मतलब यह है कि जब तक यह पूर्ण पथ तक पहुंचता है या असफल रहता है (मुझे पता है कि यह पेड़ के लिए प्राकृतिक व्यवहार नहीं है लेकिन यह मेरा ट्यूटोरियल चाहता है)।

मैं दो प्रश्न हैं: 1) क्यों मैं डेटा घोषणा में (Eq a) के बावजूद एक त्रुटि संदेश मुझे बता a /= a (अंतिम पंक्ति से) है के रूप में वहाँ No instance for (Eq a) अनुमति नहीं है कि (टर्मिनल में त्रुटि संदेश), मिलता है ?

2) त्रुटि मैं हो रही है और देखने समारोह का प्रतीत होता है अजीब व्यवहार के अलावा, इस अच्छा या मुहावरेदार हास्केल है?

धन्यवाद

+1

डेटाटाइप संदर्भ सुविधा को हास्केल के भविष्य के संस्करण में हटाया जा रहा है http://www.haskell.org/pipermail/haskell/2011-January/022497.html – sdcvvc

उत्तर

8

हास्केल में आम "gotchas" में से एक यह है कि अगर आप एक data घोषणा, हर समारोह प्रकार का उपयोग करता है वर्ग की कमी भी होना आवश्यक है पर वर्ग की कमी डाल दिया। इस कारण से, data घोषणा हास्केल में बेवकूफ नहीं है, और आपको अपनी कक्षा की बाधा को खत्म करना चाहिए। data घोषणा में कक्षा बाधा घोषित करने के लिए यह आपको कुछ भी नहीं प्राप्त करता है।

असल में, फ़ंक्शन प्रकार कक्षा की बाधा को दोहराना चाहिए। फ़ंक्शन का उपयोगकर्ता यह जानने के लिए कहता है कि उन्हें कक्षाओं के उदाहरण का उपयोग करना चाहिए? ध्यान दें कि आपके पास फ़ंक्शन के संदर्भ में परिभाषित किया गया है जो h के संदर्भ में परिभाषित किया गया है जो आपके HashTable a b प्रकार के संदर्भ में परिभाषित किया गया है, जैसे कि f आपके HashTable प्रकार का उल्लेख नहीं करता है, फिर भी टाइप निर्भरताओं के कारण प्रकार a का तर्क लेता है जो अप्रत्यक्ष रूप से और अंततः आपके HashTable प्रकार के पहले पैरामीटर के रूप में उपयोग किया जाता है। f का प्रकार में कक्षा की बाधा होनी चाहिए, हास्केल सही ढंग से इसका अनुमान लगाता है, और यदि आपकी कमी है तो यह आपके प्रकार की टिप्पणियों को अस्वीकार कर देगा।

+0

बहुत बहुत धन्यवाद - यह उत्कृष्ट समझ में आता है! – GabrielG

+1

ध्यान दें कि नवीनतम भाषा मानक पूरी तरह से डेटाटाइप संदर्भ हटा दिया गया है। –

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