13

我无法弄清楚如何使 [ 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

4 回答 4

12

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

试试这个:

import System.Environment
main = do
    args <- getArgs
    if (args !! 0) == "hello" then
        print "hello"
        else
            print "goodbye"
于 2011-05-24T22:42:31.047 回答
5

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

就像下面的错误一样……</p>

do
  1 +
  2

…以及以下作品…</p>

do
  1 +
    2

…以下也是错误的…</p>

do
  if True then 1
  else 2

…以及以下作品。

do
  if True then 1
    else 2

正如其他评论已经提到的那样,Haskell 2010允许“then”和“else”部分与“if”部分具有相同的缩进级别。

于 2011-05-24T23:47:08.277 回答
3

Haskell 语法和语言通过源文件开头的 {-# LANGUAGE ...#-} pragma 进行了扩展。DoAndIfThenElse 扩展被识别,因为它是Cabal 文档中列出的扩展之一。当前 GHC 默认启用此功能。

于 2011-05-25T11:22:35.903 回答
2

我通常缩进else一个空格多于if. 除非那时整体if非常适合单行。

于 2011-05-24T23:26:31.603 回答