समीकरणों की एक प्रणाली को हल करने के प्रकार प्रकार अनुमान के बारे में सोचें। चलो एक उदाहरण देखते हैं:
f x = (x,2)
हम f
के प्रकार कैसे मान सकते हैं? हम देखते हैं कि यह एक समारोह है:
f :: a -> b
साथ ही, f
की संरचना से हम देख सकते हैं कि निम्नलिखित समीकरणों simulatenously पकड़:
b = (c,d)
d = Int
c = a
समीकरणों की इस प्रणाली हम देख सकते हैं कि सुलझाने तक f
का प्रकार a -> (a, Int)
है। अब हम निम्नलिखित (गलत) समारोह को देखो:
f x = x : x
(:)
के प्रकार a -> [a] -> [a]
है, इसलिए इस समीकरणों के निम्नलिखित प्रणाली (सरलीकृत) उत्पन्न करता है:
a = a
a = [a]
तो हम एक समीकरण मिल a = [a]
, जिसमें से हम निष्कर्ष निकाल सकते हैं कि समीकरणों की इस प्रणाली में कोई समाधान नहीं है, और इसलिए कोड अच्छी तरह से टाइप नहीं किया गया है। अगर हमने समीकरण a = [a]
को अस्वीकार नहीं किया है, तो हम वास्तव में एक अनंत लूप को समीकरण a = [a]
, a = [[a]]
, a = [[[a]]]
, आदि हमारे सिस्टम में (वैकल्पिक रूप से, डैनियल नोट्स के उत्तर में, हमारे प्रकार के सिस्टम में अनंत प्रकारों की अनुमति दे सकते हैं, लेकिन यह टाइपशेक के लिए f x = x : x
जैसे गलत प्रोग्राम करेगा)।
तुम भी GHCi में इस परीक्षण कर सकते हैं:
> let f x = x : x
<interactive>:2:15:
Occurs check: cannot construct the infinite type: a0 = [a0]
In the second argument of `(:)', namely `x'
In the expression: x : x
In an equation for `f': f x = x : x
अपने अन्य सवाल के रूप में: GHC हास्केल के प्रकार प्रणाली ट्यूरिंग-पूर्ण नहीं है और typechecker को रोकने के लिए गारंटी है - जब तक आप UndecidableInstances
सक्षम, जिस स्थिति में यह सैद्धांतिक रूप से एक अनंत पाश में जा सकते हैं। हालांकि, जीएचसी एक निश्चित गहराई से रिकर्सन स्टैक, होने से समाप्त होने को सुनिश्चित करता है, इसलिए यह प्रोग्राम बनाना संभव नहीं है जिस पर यह कभी भी (संपादित नहीं करता है: सीएएमसीकैन की टिप्पणी के अनुसार, यह सब संभव है - एक एनालॉग है प्रकार के स्तर पर पूंछ रिकर्सन की जो स्टैक गहराई को बढ़ाए बिना लूप की अनुमति देता है)।
हालांकि, संकलन को मनमाने ढंग से लंबे समय तक लेना संभव है, क्योंकि हिंडली-मिलनर प्रकार की अनुमान की जटिलता सबसे बुरी स्थिति में घातीय है (लेकिन औसत नहीं!) मामला:
dup x = (x,x)
bad = dup . dup . dup . dup . dup . dup . dup . dup
. dup . dup . dup . dup . dup . dup . dup . dup
. dup . dup . dup . dup . dup . dup . dup . dup
. dup . dup . dup . dup . dup . dup . dup . dup
सुरक्षित हास्केल इस से बचाने नहीं होगा - mueval पर एक नज़र डालें यदि आप संभावित रूप से दुर्भावनापूर्ण उपयोगकर्ताओं को अपने सिस्टम पर हास्केल कार्यक्रमों संकलन अनुमति देना चाहते हैं।
जीएचसी को 'UndecidableInstances' के माध्यम से लटका देना पूरी तरह से संभव है। मुझे सटीक विवरण याद नहीं हैं, लेकिन आप पूंछ रिकर्सन की मात्रा का उपयोग करके स्टैक गहराई को बढ़ाए बिना लूप कर सकते हैं। –
@ सीए.एमसीकैन एक उदाहरण देखने के लिए दिलचस्प होगा। मैंने बस मैनुअल उद्धृत किया। –
अभी हाथ पर कोई उदाहरण नहीं है, लेकिन मैं आज रात आपके लिए एक खोद दूंगा। मुझे याद है कि * अनजाने में * करना मुश्किल है। –