2013-10-28 5 views
6

जीएचसी चेतावनी देता है कि मेरे पास शीर्ष स्तर पर फ़ंक्शन हस्ताक्षर नहीं हैं। मुझे नहीं पता कि मुझे उनकी आवश्यकता क्यों होगी।मेरे शीर्ष स्तर के कार्यों को हास्केल में हस्ताक्षर की आवश्यकता क्यों है?

applyValue :: forall t t1 t2 t3 t4. 
       (t2 -> t) 
       -> (t2 -> t3 -> t4 -> t1) -> t2 -> t3 -> t4 -> (t -> Bool) -> [t1] 

तो मैं क्यों परेशान करेगा उन्हें जोड़ने: उन्हें प्रदान करने के साथ समस्या यह है कि वे काफी परिष्कृत कर रहे हैं, यह एक (ऑटोजनरेटेड) की तरह है?

समारोह में ही:

applyValue getValueAt stitchAndMove at fabric mark matchAt = 
    if matchAt (getValueAt at) 
    then [stitchAndMove at fabric mark] 
    else [] 
+0

क्या आपके पास कोई एक्सटेंशन सक्षम है? –

+0

क्या हम कुछ कोड देख सकते हैं? – jozefg

+6

यदि ऐसा होता है क्योंकि आप '-Wall' के साथ संकलित कर रहे हैं, तो आप' -फनो-चेतावनी-अनुपलब्ध-हस्ताक्षर 'का उपयोग कर सकते हैं। इसे अच्छा अभ्यास माना जाता है कि उन्हें बाहर न छोड़ें - कारणों से डैनियल वाग्नेर का जवाब देखें। –

उत्तर

22
  • मशीन चेक करने योग्य प्रलेखन का एक रूप है। यदि आप मानते हैं कि सही प्रकार टाइप करने के लिए, वहां डालने से कंपाइलर को दोबारा जांचने के लिए कहा जाता है कि आपने अपने बाद के अपरिहार्य रिफैक्टरिंग सत्रों के दौरान अपना इंटरफ़ेस न खोला है।
  • मानव-पठनीय दस्तावेज़ीकरण के रूप में। यद्यपि आप देखते हैं, जब आप देखते हैं कि आप एक भयानक मशीन से उत्पन्न प्रकार लिख रहे हैं, तो शायद यह सोचने का समय है कि आपको किस प्रकार (प्रकार-स्तर) अवशेषों को मानव-पठनीय बनाने की आवश्यकता है।
  • हैडॉक के लिए। हैडॉक टिप्पणियां हस्ताक्षर टाइप करने के लिए संलग्न होती हैं, बाइंडिंग नहीं, इसलिए यदि आप एक प्रकार के हस्ताक्षर छोड़ देते हैं, तो आपके ध्यान से हाथ से लिखे दस्तावेज़ों को चुपचाप अनदेखा कर दिया जाएगा।
  • त्रुटि संदेशों और ghci क्वेरी परिणामों में सुधार करने के लिए: हालांकि प्रकार चर के वास्तविक नाम कोई फर्क नहीं पड़ता, जीएचसी उपयोगकर्ता द्वारा प्रदान किए जाने पर नामों को संरक्षित करने के लिए कड़ी मेहनत करता है। (node -> Bool) -> (edge -> Bool) -> (graph -> Bool) की तरह कुछ (t1 -> Bool) -> (t2 -> Bool) -> (t3 -> Bool) से अधिक पढ़ने योग्य हो सकता है, भले ही वे समकक्ष हों।
+1

आपका बिंदु समझ में आता है, मेरे पास एक और त्वरित सवाल है, हालांकि हस्ताक्षर ब्लॉक का पुन: उपयोग करने का कोई तरीका है, कहें कि मेरे पास एक फ़ंक्शन f1 का हस्ताक्षर है जो लंबे और परिष्कृत है, अब f2 f1 लेता है, इसलिए यह सब कुछ है f2 + जो भी f1 था। मुझे आश्चर्य है कि क्या मैं कुछ नाम (प्रकार?) पर हस्ताक्षर f1 असाइन करके कुछ काम बचा सकता हूं और जब मैं f2 के हस्ताक्षर को परिभाषित कर रहा हूं तो उस नाम से इसका संदर्भ लें। धन्यवाद –

+6

@AlekseyBykov हां, यह 'टाइप' उपनाम क्या है। आप रिपोर्ट या अपने पसंदीदा ट्यूटोरियल में उनके बारे में पढ़ सकते हैं। –

+1

हस्ताक्षर कभी-कभी आवश्यक होते हैं भले ही आपको दस्तावेज़ या त्रुटि संदेशों की परवाह न हो। कभी-कभी यह अस्पष्ट है कि आप किस प्रकार की कक्षा चाहते हैं, और इस प्रकार आपको इसे संकलित करने के लिए इसे स्पष्ट रूप से बाध्य करने की आवश्यकता है। – newacct

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