2011-05-24 26 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默认启​​用此功能。