2013-01-23 52 views
29

मान लीजिए कि एक हास्केल लाइब्रेरी डिजाइनर किसी कारण से UndecidableInstances का उपयोग करने का निर्णय लेता है। पुस्तकालय ठीक संकलित करता है। अब मान लें कि कुछ प्रोग्राम लाइब्रेरी का उपयोग करता है (जैसे कि इसके प्रकार के वर्गों के कुछ उदाहरण परिभाषित करता है), लेकिन एक्सटेंशन का उपयोग नहीं करता है। क्या ऐसा हो सकता है कि संकलन विफल रहता है (समाप्त नहीं होता है)?UndecidableInstances Pragma का उपयोग कर स्थानीय स्तर पर संकलन समाप्ति पर वैश्विक परिणाम हो सकते हैं?

यदि ऐसा परिदृश्य हो सकता है, तो मुझे एक उदाहरण देखने में खुशी होगी। उदाहरण के लिए, mtlUndecidableInstances का उपयोग करता है, क्या यह एक प्रोग्राम लिखना संभव है जो mtl (या एक्सटेंशन का उपयोग करने वाली कोई अन्य मानक लाइब्रेरी) पर निर्भर करता है, UndecidableInstances का उपयोग नहीं करता है, लेकिन अपरिहार्यता के कारण संकलित करने में विफल रहता है?

उत्तर

22

शानदार सवाल!

सामान्य रूप से यह निश्चित रूप से संभव है। इस मॉड्यूल पर विचार करें:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-} 

module M where 

class C a b | a -> b where 
    f :: a -> b 

instance C a b => C [a] [b] 
    where f = map f 

यह स्वयं ठीक से संकलित करता है। हालांकि, अगर आप इस मॉड्यूल आयात और

g x = x + f [x] 

परिभाषित आप

Context reduction stack overflow; size = 201 
Use -fcontext-stack=N to increase stack size to N 
    C [b] b 
In the second argument of `(+)', namely `f [x]' 
In the expression: x + f [x] 
In an equation for `g': g x = x + f [x] 

MTL उदाहरणों के बारे में, मैं नहीं दिख रहा है कि कैसे कुछ इस तरह संभव है मिल जाएगा, लेकिन मैं यह भी इस बात का सबूत नहीं है कि यह नहीं है।

+5

मैं आपके समाधान के साथ खेल रहा था और मैं इसे 'कक्षा सी' में कटौती करने में कामयाब रहा जहां एक एफ :: ए -> ए' और 'उदाहरण सी [[ए]] => सी [ए] जहां एफ = आईडी' , जिसे किसी भी अन्य एक्सटेंशन की आवश्यकता नहीं है लेकिन 'अपरिहार्य इंस्टेंस'। –

+4

इसे 'mtl' की जांच करने के बाद, मेरा मानना ​​है कि संकलक को इसका उपयोग करके लूप का कारण बनना संभव नहीं है। एक्सटेंशन की आवश्यकता होने का एकमात्र कारण यह है कि इसके कुछ उदाहरण विफल होते हैं [कवरेज कंडीशन] (http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/type-class-extensions.html# उदाहरण-नियम)। लेकिन स्थिति के पीछे विचार संतुष्ट है - सभी आरएएस प्रकार चर को 'mtl' के उदाहरण घोषणाओं से अनुमानित किया जा सकता है। –

+0

हू, मैं आश्चर्यचकित हूं 'सी [[ए]]' को 'फ्लेक्सिबल कॉन्टैक्स' की आवश्यकता नहीं है। –