2011-05-28 18 views
10

बस हास्केल सीखना शुरू कर दिया।हास्केल में एक फ़ंक्शन को कॉल करना - शुरुआती समस्या

मैं इस के अंदर के साथ एक खाली स्रोत फ़ाइल है:

pe :: (Integral a) => a -> a 
pe y = sum [x | x <- [1..y-1], x `mod` 3 == 0 || x `mod` 5 == 0] 

अब अगर मैं इस GHCi, मैं इतना की तरह पे कॉल कर सकते हैं:

*Main> pe 1000 
233168 

कैसे मैं इसे अपने स्रोत के भीतर से कहते हैं फाइल?

GHC stage restriction: `pe' 
    is used in a top-level splice or annotation, 
    and must be imported, not defined locally 
In the expression: pe 1000 

मैं मुख्य या कुछ में यह घोषणा करने की आवश्यकता है: यदि मैं

pe 1000 

है यह एक गुप्त त्रुटि देता है?

उत्तर

11

हां, आपको इसे अपने main फ़ंक्शन पर हुक करने की आवश्यकता है। उदाहरण के लिए,

main = print (pe 1000) 

आप एकाधिक कॉल करना चाहते हैं, तो आप उन्हें do -notation के साथ गठबंधन कर सकते हैं:

main = do 
    print (pe 500) 
    print (pe 1000) 
+4

या 'मुख्य = mapM_ (प्रिंट। पी) [1..1000] 'यदि आपको बड़ी संख्या में मूल्यों के लिए ऐसा करने की आवश्यकता है। – alternative

10

एक हास्केल स्रोत फ़ाइल परिभाषाओं, नहीं भाव का एक क्रम होता है। तो आप फ़ाइल के शीर्ष स्तर में अभिव्यक्ति नहीं डाल सकते हैं, आपको इसे परिभाषा के शरीर के अंदर रखना होगा। इसलिए pe 1000 एक परिभाषा नहीं है, इसलिए आपको एक त्रुटि मिलती है।

लेकिन ऐसा एक गुप्त त्रुटि संदेश क्यों? जीएचसी में टेम्पलेट हास्केल नामक एक एक्सटेंशन है, जो आपको संकलन समय पर प्रोग्रामेटिक रूप से परिभाषाएं बनाने की अनुमति देता है। इसे प्राप्त करने के लिए यह आपको एक ऐसे स्थान पर अभिव्यक्ति करने की अनुमति देता है जहां आम तौर पर केवल परिभाषाओं की अनुमति दी जाती है और संकलन समय पर अभिव्यक्ति का मूल्यांकन किया जाता है और अभिव्यक्ति को इसके परिणाम (जिसे परिभाषा होनी चाहिए) के साथ प्रतिस्थापित करें - इसे स्प्लिसिंग कहा जाता है और अभिव्यक्ति तब होती है एक splice कहा जाता है।

  1. किसी भी अभिव्यक्ति में प्रयोग किया जाता पहचानकर्ता (एक अलग स्रोत फ़ाइल में परिभाषित किया जाना चाहिए यह आवश्यक है ताकि जब अभिव्यक्ति का सामना करना पड़ा है इस्तेमाल किया कार्यों को पहले से ही संकलित किए जाते हैं और इस तरह हो सकता है: इस तरह के एक जोड़ दो आवश्यकताओं को पूरा करने की जरूरत है संकलन समय के दौरान बुलाया जाता है)
  2. अभिव्यक्ति का प्रकार एक टेम्पलेट हास्केल प्रकार होना चाहिए जो वैध परिभाषा का प्रतिनिधित्व करता है।

इसलिए आपकी अभिव्यक्ति pe 1000 कहीं दिखाई देती है जहां केवल परिभाषाओं की अनुमति है, जीएचसी मानता है कि यह एक विभाजन है। हालांकि, यह उपर्युक्त मानदंडों में से पहला नहीं मिलता है, यानी यह एक अलग फ़ाइल की बजाय वर्तमान फ़ाइल में परिभाषित किया गया है, जीएचसी इसके बारे में शिकायत करता है। बेशक यह दूसरी स्थिति को पूरा नहीं करता है, लेकिन जीएचसी अभी तक प्राप्त नहीं हुआ है, जब यह त्रुटि संदेश उत्पन्न करता है। यदि pe को किसी अन्य स्रोत फ़ाइल में परिभाषित किया गया था, तो आपको इस तथ्य के बारे में शिकायत करने में एक त्रुटि संदेश प्राप्त हुआ होगा कि pe में गलत प्रकार है।

+0

धन्यवाद; बहुत सराहना की। –

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