在Haskell中的do-blocks中简洁if-then-else表示法

时间:2011-05-24 22:35:40

标签: haskell do-notation

我无法弄清楚如何在[http://hackage.haskell.org/trac/haskell-prime/wiki/DoAndIfThenElse]中提到简洁的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"

4 个答案:

答案 0 :(得分:12)

您提供的链接描述了一个提案,听起来它不是Haskell标准的一部分(尽管链接提到它是在jhc,GHC和Hugs中实现的)。您正在使用的Haskell编译器版本或您正在使用的标记集可能不允许链接中描述的可选分号行为。

试试这个:

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

答案 1 :(得分:5)

在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允许“then”和“else”部分与“if”部分在同一级别的缩进上。

答案 2 :(得分:3)

Haskell语法和语言在source files的开头通过{ - #LANGUAGE ...# - } pragma扩展。 DoAndIfThenElse扩展名被识别,因为它是Cabal documentation中列出的扩展名之一。当前GHC默认启​​用此功能。

答案 3 :(得分:2)

我通常比else缩进if一个空格。除非那么整个if完全适合单行。