कोडअनुमति दें विशिष्ट प्रकार और इस "अंतिम" उदाहरण में इसकी आवश्यकता क्यों है?
{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}
-- I know this particular example is silly.
-- But that's not the point here.
g :: forall a . RealFloat a => Bool
g = True
main :: IO()
main = print (g @Double)
त्रुटि
• Could not deduce (RealFloat a0)
from the context: RealFloat a
bound by the type signature for:
g :: RealFloat a => Bool
at app/Main.hs:3:6-35
The type variable ‘a0’ is ambiguous
• In the ambiguity check for ‘g’
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
In the type signature:
g :: forall a. RealFloat a => Bool
साथ GHC 8.0 पर संकलित करने के लिए तो AllowAmbiguousTypes
जोड़ने कोड संकलन कर देगा विफल रहता है।
यहाँ मेरी प्रश्न हैं:
- वास्तव में क्या
AllowAmbiguousTypes
है? - इस विशेष कोड को काम करने के लिए इसकी आवश्यकता क्यों है?
- मुझे डर है कि
AllowAmbiguousTypes
जोड़ना मुझे इस विशेष कोड में वास्तव में चाहते हैं। यह डरावना लगता है। ऐसा लगता है जैसे यह हास्केल की टाइप सिस्टम को कम सुरक्षित बनाएगा, शायद अन्य क्षेत्रों में जिनके पास इस विशेष कोड से कोई लेना देना नहीं है। क्या ये भय निराधार हैं? - क्या कोई विकल्प हैं? इस मामले में, ऐसा लगता है जैसे हास्केल
a0
टाइप वैरिएबल डालने वाला है जिसे मैंने कभी नहीं पूछा था। क्या इन असाधारण प्रकार चर बनाने के लिए हास्केल को बताने के लिए कोई विस्तार नहीं है - और केवल उन लोगों का उपयोग करें जिन्हें मैंने स्पष्ट रूप से अपने स्वयं के स्पष्टforall a
के साथ जोड़ने के लिए कहा था? - user2407038 की टिप्पणी के कारण एक प्रश्न जोड़ा गया: क्या आप कहेंगे कि
AllowAmbiguousTypes
एक गलत नाम है? क्या इसे बेहतरAllowUnusedTypeVariables
के रूप में नामित किया गया होगा?
एक संदिग्ध प्रकार वह है जिसमें उसके संदर्भ में एक प्रकार परिवर्तनीय होता है जिसका उल्लेख शरीर में नहीं किया गया है (कि '=> '' के दाईं ओर)। तो 'RealFloat a => ..' अस्पष्ट है जब '..' का उल्लेख नहीं है। अस्पष्ट प्रकार आम तौर पर एक प्रोग्रामर त्रुटि होते हैं, और टाइपएप्लिकेशंस से पहले वे पूरी तरह से बेकार थे, इसलिए आपको उन्हें अनुमति देने के लिए एक एक्सटेंशन की आवश्यकता है। पिछले दो प्रश्नों के लिए: यह किसी भी तरह से टाइपशेकर 'असुरक्षित' नहीं बनाता है; और आपका विकल्प 'RealFloat a => प्रॉक्सी ए -> बूल' लिखना है, जहां [प्रॉक्सी] (https://hackage.haskell.org/package/base-4.9.1.0/docs/Data-Proxy.html) है यहाँ। – user2407038
एक विकल्प के रूप में, आप 'RealFloat a => टैग की गई एक बूल' का उपयोग कर सकते हैं, जहां 'टैग की गई' 'टैग की गई 'पैकेज से आती है, जो कुछ परिस्थितियों में प्रॉक्सी तरीके से अधिक कुशल हो सकती है। – dfeuer
'मेरी आंखों में अनुमति दें', हानिरहित है। कई लैम्ब्डा कैलकुली में, प्रकार हमेशा स्पष्ट रूप से पारित होते हैं (उदा। 'मानचित्र @ ए @ बी एफ एक्सएस')। सादा हास्केल में, प्रकार अनुमानित होते हैं - जिसका मतलब है कि हमें उन्हें (अच्छा) पास नहीं करना है, और अगर हम चाहते हैं कि हम उन्हें भी पास नहीं कर सकते हैं। इसके कारण, टाइमर वाले प्रकार जिन्हें तर्क के प्रकार से अनुमानित नहीं किया जा सकता है या वापसी मूल्य प्रतिबंधित होना चाहिए। इसलिए हमें अव्यवस्था को जोड़ने के लिए केवल उन्हें छेड़छाड़ करने के लिए प्रॉक्सी/टैग का उपयोग करना होगा। हालांकि, अब जीएचसी स्पष्ट प्रकार के अनुप्रयोगों की अनुमति देता है, इसलिए हमें अब ऐसा नहीं करना है। – chi