2011-05-24 11 views
13

में डू-ब्लॉकों में अगर अन्यथा नोटेशन की तुलना में मैं समझ नहीं पा रहा हूं तो मैं समझ नहीं पा रहा हूं कि अगर [http://hackage.haskell.org/trac/haskell-prime/wiki/DoAndIfThenElse] पर उल्लिखित संक्षेप में संक्षिप्त कैसे किया जाए। यह काम करता है,हास्केल

import System.Environment 
main = do 
    args <- getArgs 
    if (args !! 0) == "hello" 
     then 
      print "hello" 
     else 
      print "goodbye" 

लेकिन यह नहीं करता है, और डालने कहा अर्धविराम (लिंक देखें) सिर्फ मेरे लिए पार्स त्रुटि में परिणाम।

import System.Environment 
main = do 
    args <- getArgs 
    if (args !! 0) == "hello" then 
     print "hello" 
    else 
     print "goodbye" 
+2

जीएचसी का आप किस संस्करण का उपयोग कर रहे हैं? - या, क्या आप जीएचसी का उपयोग कर रहे हैं? :) – porges

+0

6.12.3 (दुर्भाग्य से, ओपनएसयूएसई बाइनरी तारीख से बाहर हैं) – gatoatigrado

+0

आप अपनी लाइनों से और फिर क्यों अलग कर रहे हैं? – alternative

उत्तर

12

लिंक आपके द्वारा दी गई एक प्रस्ताव है, जो लगता है जैसे कि यह हास्केल मानक का हिस्सा नहीं है (हालांकि लिंक का उल्लेख है कि यह JHC, GHC और हग्स में लागू है) का वर्णन है। यह संभव है कि आपके द्वारा उपयोग किए जा रहे हास्केल कंपाइलर का संस्करण, या आपके द्वारा उपयोग किए जा रहे झंडे का सेट, लिंक में वर्णित वैकल्पिक-अर्धविराम व्यवहार की अनुमति नहीं देता है।

इस प्रयास करें:

import System.Environment 
main = do 
    args <- getArgs 
    if (args !! 0) == "hello" then 
     print "hello" 
     else 
      print "goodbye" 
+2

प्रस्ताव हास्केल 2010 में स्वीकार किया गया था। यह जीएचसी पर बदलाव किए बिना काम करता है 7.0.2। – hammar

+0

ओह! जानकार अच्छा लगा! यह संभव है कि gatoatigrado इसके समर्थन के बिना जीएचसी के पुराने संस्करण का उपयोग कर रहा था। – Zach

2

मैं आमतौर पर else एक अंतरिक्ष if की तुलना में अधिक इंडेंट। जब तक कि पूरे if एक पंक्ति पर अच्छी तरह फिट बैठता है।

4

हास्केल 98 में "अगर ... फिर ... और ..." a single expression है। यदि यह कई पंक्तियों में विभाजित है, तो पहले वाले लोगों को आगे इंडेंट किया जाना चाहिए।

वैसे ही जैसे निम्नलिखित गलत है ...

do 
    1 + 
    2 

... और निम्न काम करता है ...

do 
    1 + 
    2 

... निम्नलिखित भी गलत है ...

do 
    if True then 1 
    else 2 

... और निम्न काम करता है ।

do 
    if True then 1 
    else 2 

अन्य टिप्पणी पहले ही उल्लेख किया है, Haskell 2010 "फिर" और "अगर" भाग के रूप में खरोज का एक ही स्तर पर "और" भागों की अनुमति देता है।

3

source files की शुरुआत में {- # LANGUAGE ... # -} pragmas हालांकि Haskell वाक्यविन्यास और भाषा विस्तारित हैं। DoAndIfThenElse एक्सटेंशन को पहचाना जाता है क्योंकि यह Cabal documentation में सूचीबद्ध लोगों में से एक है। वर्तमान जीएचसी डिफ़ॉल्ट रूप से इसे सक्षम बनाता है।