2011-12-09 12 views
94

में मल्टी-लाइन कमांड मुझे ghci में बहु-पंक्ति कमांड दर्ज करने में समस्या हो रही है। निम्नलिखित 2 लाइन कोड एक फ़ाइल से काम करता है:जीएचसीआई

addTwo :: Int -> Int -> Int 
addTwo x y = x + y 

लेकिन जब मैं GHCi में प्रवेश करते हैं, मैं त्रुटियों मिलता है। मैंने :{ ... :} के अंदर कोड डालने का भी प्रयास किया, लेकिन वे इस उदाहरण के लिए भी काम नहीं कर रहे हैं, क्योंकि यह सिर्फ एक पंक्ति में लाइनों को जोड़ रहा है, जो मामला नहीं होना चाहिए।

मैं WinGHCi, संस्करण 2011.2.0.1

+2

संभावित डुप्लिकेट [कैसे कई लाइनों में ghci में फ़ंक्शन को परिभाषित करने के लिए?] (Http://stackoverflow.com/questions/2846050/how-to-define-a-function-in-ghci-across-multiple- लाइनें) – devnull

उत्तर

125

अधिकांश समय का उपयोग कर रहा है, तो आप आप के लिए एक हस्ताक्षर बाहर काम करने के प्रकार निष्कर्ष पर भरोसा कर सकते हैं। अपने उदाहरण में, निम्नलिखित के लिए पर्याप्त है:

Prelude> let addTwo x y = x + y 

तुम सच में एक प्रकार हस्ताक्षर के साथ एक परिभाषा चाहते हैं, या अपनी परिभाषा को कई पंक्तियों से अधिक तक फैला हैं, तो आप GHCi में ऐसा कर सकते हैं:

Prelude> :{ 
Prelude| let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| :} 
Prelude> addTwo 4 7 
11 

नोट आप भी एक लाइन पर इस निचोड़ कर सकते हैं कि:

Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y 

आप दस्तावेज की Interactive evaluation at the prompt खंड पर GHCi के साथ बातचीत के बारे में और अधिक जानकारी प्राप्त कर सकते हैं।

+1

दोनों समाधानों के लिए बहुत बहुत धन्यवाद। लेकिन मेरे पास एक और संबंधित सवाल है: दूसरी पंक्ति में चार प्रमुख रिक्त स्थान क्यों आवश्यक हैं (addTwo से पहले)? और यह सटीक होना चाहिए, यदि कम या अधिक रिक्त स्थान हैं, तो एक त्रुटि है। – R71

+7

@ रॉग 'चलो' एक ब्लॉक शुरू होता है; ब्लॉक में प्रविष्टियां इंडेंटेशन द्वारा समूहीकृत की जाती हैं; और एक ब्लॉक में पहला गैर-व्हाइटस्पेस चरित्र उस इंडेंटेशन को सेट करता है जिसके द्वारा उन्हें समूहीकृत किया जाता है। चूंकि उपरोक्त 'लेट' ब्लॉक में पहला गैर-व्हाइटस्पेस वर्ण 'addTwo'' का 'ए' है, इसलिए ब्लॉक में सभी पंक्तियों को उस 'ए' के ​​रूप में गहराई से इंडेंट किया जाना चाहिए। –

+0

धन्यवाद। मैंने यह भी देखा कि अन्य चलो/जहां ब्लॉक।यह उन अन्य भाषाओं से एक बड़ा अंतर है जहां व्हाइटस्पेस को अनदेखा किया जाता है, इसलिए मुझे इसे समझने में कुछ कठिनाई थी। – R71

11

उपयोग let:

Prelude> :{ 
Prelude| let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| :} 
Prelude> addTwo 2 3 
5 
73

GHCi ऊपर फायरिंग और :set +m टाइप करके इस समस्या का समाधान:

Prelude> :set +m 
Prelude> let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| 
Prelude> addTwo 1 3 
4 

बूम।


यहाँ क्या हो रहा है (और मैं आप ज्यादातर बात कर रहा हूँ, व्यक्ति की मदद के लिए googling जबकि Learn You A Haskell माध्यम से अपने तरीके से काम कर रहा) है कि GHCi एक इंटरैक्टिव वातावरण जहां समारोह नामों की बाइंडिंग बदल रहे है उड़ान पर। आपको अपनी फ़ंक्शन परिभाषाओं को let ब्लॉक में लपेटना होगा, ताकि हास्केल जानता है कि आप कुछ परिभाषित करने वाले हैं। :set +m सामान मल्टीलाइन :{कोड:} निर्माण के लिए लघुरूप है।

व्हाइटस्पेस ब्लॉकों में भी महत्वपूर्ण है, इसलिए आपको let में चार रिक्त स्थानों के लिए चार रिक्त स्थानों के अनुसार अपनी टाइप परिभाषा के बाद अपनी फ़ंक्शन परिभाषा को इंडेंट करना होगा।

+3

इतना आसान, लेकिन स्पष्ट नहीं है। मैं जिस पुस्तक का उपयोग कर रहा था उस पर चिल्लाना चाहता था कि मुझे पृष्ठ 1 पर नहीं बता रहा था! – Tim

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