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

gat*_*ado 13 haskell do-notation

我无法弄清楚如何制作简明的if-then-else表示法,请参阅[ 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"
Run Code Online (Sandbox Code Playgroud)

但这不,并且插入所述分号(请参阅链接)只会导致我的解析错误.

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

Zac*_*ach 12

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

试试这个:

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

  • 该提案被Haskell 2010接受.它在GHC 7.0.2上没有变化. (2认同)

小智 5

在Haskell 98中"if ... then ... else ..."是一个单独的表达式.如果它被拆分为多行,则第一行后面的行必须进一步缩进.

就像以下是错误的......

do
  1 +
  2
Run Code Online (Sandbox Code Playgroud)

......以及以下作品......

do
  1 +
    2
Run Code Online (Sandbox Code Playgroud)

......以下也是错误的......

do
  if True then 1
  else 2
Run Code Online (Sandbox Code Playgroud)

......以及以下工作.

do
  if True then 1
    else 2
Run Code Online (Sandbox Code Playgroud)

正如其他评论已经提到的那样,Haskell 2010允许"then"和"else"部分与"if"部分在同一级别的缩进上.