2013-04-21 8 views
6

कहें कि मेरे पास निम्न (गलत) कोड है।हास्केल पहुंच योग्य कोड बग?

data A a b where 
    APure :: (A a b) 
    AApply :: A (A b c) c 

test :: (A a b) -> a -> b 
test (APure) a = a 
test AApply a = undefined 

GHC तो मुझे इस त्रुटि दे देंगे:

Couldn't match type `b' with `A b1 b' 
    `b' is a rigid type variable bound by 
     the type signature for test :: A a b -> a -> b 
Inaccessible code in 
    a pattern with constructor 
    AApply :: forall c b. A (A b c) c, 
    in an equation for `test' 
In the pattern: AApply 
In an equation for `test': test AApply a = undefined 

यह त्रुटि संदेश पूरी तरह से गलत नहीं है? त्रुटि में एपली के साथ कुछ लेना देना नहीं है।

+1

यदि आप इसे 'ए (ए बी सी) सी' के रूप में घोषित करते हैं तो' एपली 'सामान्य प्रकार' ए ए बी 'होना चाहिए? ऐसा लगता है कि आप 'concat' को परिभाषित कर रहे थे :: [ए] -> [बी] '' concat '= concat' के रूप में: हास्केल 'b" को' b '' को एकीकृत करने के लिए कैसे जा रहा है? – leftaroundabout

+1

हां, यह अनजान है। शायद आपको [एक बग फाइल करना चाहिए] (http://hackage.haskell.org/trac/ghc/newticket?type=bug)। –

+0

@ बाएंअराउंडबाउट मैं वास्तव में समझ में नहीं आता कि आपका क्या मतलब है, लेकिन वह मामला पूरी तरह से सही है। जीएडीटी के साथ पैटर्नमैचिंग पर पढ़ें। – nulvinge

उत्तर

4

Isn't this error message completely wrong? The error has nothing to do with AApply .

पूरी तरह से नहीं। यह तर्कसंगत रूप से एक बग है कि आपको वह त्रुटि संदेश मिलता है, लेकिन यह आधार से पूरी तरह से बंद नहीं है।

टुकड़ों को देखने के बाद पूरी चीज को एक साथ देखें।

test (APure) a = a 

का कहना है कि हम एक समारोह

test :: A a b -> r -> r 

रखें हस्ताक्षर

test :: (A a b) -> a -> b 

और एकजुट साथ कि एक साथ है, पहले समीकरण से प्रकार की त्रुटि अनदेखी, प्रकार

को परिष्कृत किया जाता है
test :: A r r -> r -> r 

फिर, समीकरण

test AApply a = undefined 

और देखते हैं कि कैसे परिष्कृत प्रकार के नीचे पहुंचा नहीं जा सकता पर देखने

AApply :: A (A b c) c 

के बाद से

c ~ A b c 

करना पड़ेगा अगर AApply एक वैध पहला तर्क थे।

+0

मुझे ऐसा कुछ संदेह हुआ जैसे ऐसा हुआ। यह 'ए आर आर -> आर -> आर' के लिए एकजुट क्यों है? फ़ंक्शन के प्रकार को निर्दिष्ट करते समय टाइप किसी और चीज़ में कैसे बदल सकता है? – nulvinge

+0

जीएडीटी के साथ, आपको टाइप परिशोधन मिलता है। मुझे लगता है कि यहां क्या होता है टाइप-चेकर में एक बग है (और 6.12.3 के साथ, आपको असुरक्षित ''पहले समीकरण के लिए अनुमानित प्रकार' ए'' के विरुद्ध अपेक्षित प्रकार 'बी' से मेल नहीं मिला; 7.0, 7.2 और 7.4 दूसरे समीकरण के लिए केवल त्रुटि देते हैं; 7.6 दोनों) - resp। त्रुटि संदेश निर्माता, परिष्करण घबरा गया। यह पहले समीकरण में त्रुटि पर रोक दिया जाना चाहिए था। लेकिन एक बार जब यह जारी रहा, तो यह असंगत परिकल्पनाओं के साथ काम करता था, इसलिए यह आश्चर्य की बात नहीं है कि यह मूर्खतापूर्ण परिणाम के साथ समाप्त होता है। –

+0

ओह, तो यह एक बग है जो तय है (लेकिन मेरा जीएचसी संस्करण पुराना है)। धन्यवाद! – nulvinge

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