2013-03-29 4 views
7
pow1 b e 
| (e == 0) = 1 
| otherwise = b * pow1 b (e-1) 

मेरे पास एक .hs फ़ाइल में बिल्कुल कोड है और लोड होने पर मुझे हमेशा एक ही पार्स त्रुटि मिलती है। मुझे नहीं लगता कि इसमें वास्तव में कोई गलती है - इसलिए मेरा वर्तमान विचार यह है कि "|" साइन एक हैकेल चाहता है, लेकिन यह मेरे मैकबुक कीबोर्ड (मैक ओएस का उपयोग कर) पर मानक है। क्या यह संभव है, और यदि ऐसा है तो मैं इसके आसपास कैसे जाऊं? मैं वर्तमान में सादा पाठ सेटिंग के साथ, कोड लिखने के लिए TextEdit का उपयोग कर रहा हूं।हास्केल - इनपुट पर पार्स त्रुटि '|'

+2

मैं टेक्स्टएडिट की बजाय हास्केल (वीम, एमैक्स, सब्लिमे टेक्स्ट 2) के लिए एक अच्छा संपादक का उपयोग करने की अत्यधिक अनुशंसा करता हूं। –

उत्तर

14

गार्ड को इंडेंट करना सुनिश्चित करें; हास्केल में महत्वपूर्ण सफेद जगह है।

pow1 b e 
    | (e == 0) = 1 
    | otherwise = b * pow1 b (e-1) 
+3

और इसे जोड़ने के लिए: रिक्त स्थान के साथ इंडेंट, * नहीं * टैब। (उदाहरण के लिए सुनिश्चित करें कि आपका संपादक टैब को रिक्त स्थान में परिवर्तित कर देता है।) – huon

+2

हास्केल में महत्वपूर्ण व्हाइटस्पेस है, * जब तक कि आप हर जगह ब्रैकेट के साथ अपना कोड लिखना नहीं चाहते – amindfv

5

आपको केवल गार्ड के सामने रिक्त स्थान जोड़ने और कोड ठीक काम करने की आवश्यकता है।

pow1 b e 
    | (e == 0) = 1 
    | otherwise = b * pow1 b (e-1) 

(user142019 पहले से ही इस समाधान में कहा गया है, फिर भी मुझे लगा कि एक स्पष्टीकरण समाधान को समझने की जरूरत है)

स्पष्टीकरण:

हास्केल अंतरिक्ष indentations का उपयोग करता है संरचना और के दायरे को नियंत्रित करने के यह कोड है अन्य प्रोग्रामिंग भाषाएं (उदाहरण के लिए जावा की तरह) ऐसा करने के लिए घुंघराले ब्रैकेट पर भरोसा करते हैं, हास्केल के बजाय इंडेंटेशन हैं।

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

मैक चरित्र कुंजी और न ही आपके टेक्स्ट एडिटर के साथ कुछ भी गलत नहीं है।

इंडेंटेशन के विषय पर: टैब काम नहीं करेंगे। तो आपको एक टैब वर्ण के बजाय 4 रिक्त स्थान (मैं पुनः प्रतिक्रिया दूंगा) डालने के लिए मैन्युअल रूप से रिक्त स्थान दर्ज करना होगा या अपने संपादक की टैब सेटिंग्स को बदलना होगा। (नोटपैड ++ इसे उदाहरण के लिए अनुमति देता है, यह हैस्केल के साथ उपयोग के लिए मेरी पसंदीदा पसंद है)।

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