2011-07-16 36 views
6

मैंने हास्केल के साथ प्रयोग करना शुरू कर दिया है और समस्या है। qqq एक ऐसा फ़ंक्शन है जिसे "कुछ भी नहीं" कहा जाता है और "बस कुछ" के साथ बुलाए जाने पर अन्य चीजों को प्रिंट करने के लिए एक स्ट्रिंग मुद्रित करनी चाहिए।हास्केल के "शायद" का उपयोग करके, घोषणाएं टाइप करें [शुरुआती प्रश्न]

qqq Nothing = print "There isn't anything to be printed." 
qqq (Just x) = print "There is something to be printed." >> print x 

main :: IO() 
main = qqq (Just 43) 

लेकिन:

पहला प्रयास काम करने की तरह लगता है

  • जब मैं main = qqq (Nothing) यह विफल करने की कोशिश ("अस्पष्ट प्रकार चर` a0 'बाधा में: (दिखाएँ a0) 'QQQ' ") की एक उपयोग से उत्पन्न होने
  • विफल रहता है अगर मैं प्रकार हस्ताक्षर जोड़ने के लिए चाहते हैं:
    • qqq :: Maybe x => x -> IO() ->Type constructor 'Maybe' used as a class -> लेकिन है ना?
    • qqq :: (Maybe x) -> IO()। अब हस्ताक्षर खुद सफल होने जैसा दिखता है। लेकिन main = qqq (Just 43)main = qqq (Nothing) मामले में उस रहस्यमय (Show a0) त्रुटि के साथ विफल होने लगते हैं।

सवाल:

  1. क्यों Nothing साथ QQQ बुला Just 43 साथ बुला से क्यों भिन्न है?
  2. (Show a0) क्या है? यह केवल त्रुटि संदेशों में उल्लेख किया गया है। इसका उपयोग करने के किसी भी प्रयास से "दायरे में न दिखाएं" जैसी कुछ चीजें होती हैं।
  3. इसके लिए सही प्रकार का हस्ताक्षर क्या है? Haskell प्रिंट प्रकार हस्ताक्षर कैसे इसे कम करने के लिए? कुछ उम्मीद की तरह:
f 0 = 2 
f x = (f (x-1)) + 3 

main = print get_type_as_string(f) 
-- prints "Number -> Number" 

उत्तर

9

qqq के प्रकार है:

qqq :: Show a => Maybe a -> IO() 

इसका मतलब है कि qqqसाथ प्रकार Maybe a की एक पैरामीटर लेता है और एक मूल्य के बिना एक आईओ कार्रवाई देता है, बाधा कि aShow टाइपक्लास लागू करता है। Show क्या है, यह जानने के लिए, आप ghci में :i Show का उपयोग कर सकते हैं।

Show एक टाइपक्लास है जिसके लिए आवश्यक है कि प्रकार का मान स्ट्रिंग में परिवर्तित किया जा सके। qqq में बाधा है क्योंकि print मान मुद्रित करना चाहता है (print टाइप Show a => a -> IO() है)। Maybe एक टाइपक्लास नहीं है लेकिन डेटा प्रकार है। आप टाइपक्लास here के बारे में अधिक पढ़ सकते हैं।

आप जीएचसी को किसी .hs फ़ाइल में फ़ंक्शन टाइप करके टाइप हस्ताक्षर को कम कर सकते हैं, फिर फ़ाइल को ghci (ghci Myfile.hs) के साथ लोड कर सकते हैं, और उसके बाद प्रकार को प्रदर्शित करने के लिए :t qqq टाइप कर सकते हैं।आप let qqq n = case n of { Nothing -> print "abc"; Just x -> print "def" >> print x } के साथ इंटरैक्टिव सत्र में फ़ंक्शन को भी परिभाषित कर सकते हैं (यह थोड़ा अलग दिखता है क्योंकि फ़ंक्शन परिभाषा ghci में एक पंक्ति पर होना चाहिए, लेकिन इसका अर्थ समान है)।

जब मुख्य कॉल qqq (Just 43) साथ qqq, यह स्पष्ट है Maybe a की ठोस प्रकार एक अंकीय प्रकार (पूर्णांक के लिए GHCi चूक) है, इसलिए qqqMaybe Integer -> IO() की ठोस प्रकार है। हालांकि, मुख्य कॉल qqqqqq Nothing, a कुछ भी हो सकता है (यह संदिग्ध है) और ghci एक त्रुटि रिपोर्ट करता है।

+0

ने गैर-पूछे जाने वाले प्रश्न का उत्तर दिया, "मैं ghci में कुछ भी क्यों सेट नहीं कर सकता, यह '='' –

+0

पर 'पार्स त्रुटि' की शिकायत करता है क्या "संदिग्ध प्रकार" हमेशा हास्केल में विफल रहता है या यह "प्रकार" तय कर सकता है यहाँ कोई फर्क पड़ता है, तो कभी-कभी अस्पष्ट होना चाहिए "कभी-कभी? –

+0

हास्केल संदिग्ध प्रकार की शिकायत करता है जब संकलक को नहीं पता कि क्या करना है। तो यदि संकलक यह पता लगा सकता है कि किस प्रकार का कोई समस्या नहीं है, लेकिन यदि इस प्रकार के बारे में पर्याप्त जानकारी के बिना इस प्रकार का अनुमान लगाया जाना चाहिए तो आपको त्रुटि मिल जाएगी। – Antti