इनपुट पर हास्केल त्रुटि पार्स त्रुटि `= '


111

मैं हास्केल के लिए नया हूँ और शुरू करने के बाद ghciमैंने कोशिश की:

f x = 2 * x

और मैंने प्राप्त किया:

<interactive>:1:4: parse error on input `='

जो मुझे समझ नहीं आ रहा है।

अजीब तरह से, यह पहले अच्छी तरह से काम किया। मुझे लगता है कि मैंने गलत तरीके से हास्केल किया है। Ghc6 को पुनर्स्थापित करने से समस्या हल नहीं होती है।

जानकारी के लिए, मैं Ubuntu 10.4 का उपयोग करता हूं और ghc6 का संस्करण 6.12.1-12 है

जवाबों:


160

जीएचसीआई 7.x या उससे नीचे, आपको letइसमें चीजों को परिभाषित करने की आवश्यकता है।

Prelude> let f x = x * 2
Prelude> f 4
8

जीएचसी 8.0.1 से शुरू होकर, जीएचसीआई में शीर्ष-स्तरीय बाइंडिंग का समर्थन किया जाता है , इसलिए ओपी का कोड बिना बदलाव के काम करेगा।

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8

15
धन्यवाद। "रियल वर्ल्ड हैस्केल" (कम से कम संस्करण मेरे पास है) letइसके उदाहरणों में नहीं है
मीका

43
"आप हास्केल सीखें" यह बिल्कुल भी उल्लेख नहीं करता है।
बकुरीउ

2
@ बकुरीउ अब उल्लेख LYAH करता हैlet । लेकिन एक अनुवर्ती। में LYAHमैंने पढ़ा है addThree :: Int -> Int -> Int -> Int(newline) addThree x y z = x + y + z, लेकिन केवल एक दूसरे में रन GHCiके साथ let। क्यों?
isomorphismes

9
@ बकुरीयू हाँ, लेकिन लेखक आपको एक बाहरी फ़ाइल में अपनी परिभाषाएँ लिखने और इसे GHCI के भीतर लोड करने के लिए कहता है, न कि उन्हें सीधे GHCI में लिखने के लिए। और पूर्व पूरी तरह से काम करता है।
सुपरजम्प

यह ट्यूटोरियल तब सादा गलत है: seas.upenn.edu/~cis194/lectures/01-intro.html । फिर भी यह हस्केल वेबसाइट पर अनुशंसित पहला ट्यूटोरियल है!
कैममिल

51

जब आप एक Haskell स्रोत फ़ाइल में टाइप करते हैं,

f x = 2 * x

सही है।

जब आप सीधे ghci में टाइप करते हैं, तो आपको letलाइन की शुरुआत में टाइप करना होगा:

let f x = 2 * x

12
यह GHCi में काम क्यों नहीं करता है? वाक्य रचना में अंतर क्यों है?
बीट

1
@ बीट जीएचसीआई डिफ़ॉल्ट रूप से अभिव्यक्तियों का मूल्यांकन करने की कोशिश करता है, न कि पार्स बयान, जबकि फ़ाइल प्रारूप विपरीत है। इसीलिए, स्टेटमेंट बनाने के लिए (यानी: वेरिएबल सेट करें, फ़ंक्शंस को परिभाषित करें, आदि) आपको यह घोषित करना होगा कि आप क्या कर रहे हैं let। जीएचसीआई को एक बड़ा let ... in ...बयान मानें ।
AJFarmar

20

Ghci का उपयोग करने के लिए अंगूठे का एक अच्छा नियम यह है कि आपके द्वारा दर्ज किया गया कोई भी कोड do-block शब्दार्थ के अनुरूप होना चाहिए; यही है, आप वाक्यविन्यास मान सकते हैं कि आप IO monad के भीतर प्रोग्रामिंग कर रहे हैं (यदि यह नई शब्दावली है, तो चिंता न करें! मैं इस ट्यूटोरियल के माध्यम से पढ़ने की अत्यधिक सलाह देता हूं )।

यह उत्तर इस बिंदु को एक उदाहरण के साथ दिखाता है, और IO और ghci की प्रकृति में अधिक कामकाजी अंतर्दृष्टि प्रदान कर सकता है।


26
यह उत्तर एक शुरुआत के लिए बेकार है। वह आगे बढ़ने के लिए एक सरल कार्रवाई योग्य संकेत की तलाश में है, उन्नत विषयों पर नहीं। आप बहुपद उत्पादों को गुणा तालिका सीखने वाले बच्चे को नहीं समझाते हैं - यह नहीं दिखाता है कि आप कितना जानते हैं, यह दिखाता है कि आप जो जानते हैं उसे साझा करने का तरीका नहीं जानते हैं।
btk

3
@btk: हर किसी को कुछ बिंदु पर एक शुरुआत होने से रोकना होगा। मैंने कल हास्केल सीखना शुरू किया और मुझे विश्वास है कि थोड़े समय के भीतर, मैं रायज़ के कहे अनुसार सब कुछ समझ जाऊँगा।
विट्ठि फुवन

10
हास्केल सीखने का यह मेरा पहला दिन है, और मुझे यह उत्तर यह समझने के लिए बहुत उपयोगी लगा कि मुझे क्यों उपयोग करना है let; मैं "wtf की तरह था, मुझे इसका उपयोग क्यों करना है let" और फिर मैंने इसे पढ़ा और प्रबुद्ध हुआ।
ब्रायन टिंगल

4

जीएचसी 8.0.1 में शुरू होने से यह अब एक त्रुटि नहीं पैदा करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.