2011-05-24 54 views
13

我無法弄清楚如何在[http://hackage.haskell.org/trac/haskell-prime/wiki/DoAndIfThenElse]中提到的簡明if-then-else符號工作。這工作,Haskell中do-block的簡明if-then-else符號

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

你使用什麼版本的GHC? - 或者,你在使用GHC嗎? :) – porges 2011-05-24 22:40:32

+0

6.12.3(不幸的是,OpenSuSE的二進制文件已經過時了) – gatoatigrado 2011-05-24 22:59:11

+0

爲什麼要將你的時間和其他時間分開? – alternative 2011-05-24 23:07:54

回答

12

您所提供的鏈接描述了一個建議,這聽起來像它不是哈斯克爾標準的一部分(雖然鏈接提到,它在JHC,GHC和擁抱真實實現)。您正在使用的Haskell編譯器版本或您使用的一組標記可能不允許鏈接中描述的可選分號行爲。

試試這個:

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

該提案已被接受到Haskell 2010中。 7.0.2。 – hammar 2011-05-24 23:07:13

+0

哦!很高興知道! gatoatigrado可能會使用GHC的舊版本,但不支持該功能。 – Zach 2011-05-24 23:26:32

2

我通常縮進else一個空間比if多。除非整個if很好地符合一條線。

4

在Haskell 98「if ... then ... else ...」是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

Haskell語法和語言通過source files開頭的{ - #LANGUAGE ...# - }編譯指示進行了擴展。 DoAndIfThenElse延期被認可,因爲它是Cabal documentation中列出的延期之一。當前GHC默認啓​​用此功能。