Краткая запись if-then-else в do-блоках в Haskell - PullRequest
13 голосов
/ 25 мая 2011

Я не могу понять, как сделать краткую запись 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"

, но это не так, и вставка указанных точек с запятой (см. Ссылку) просто приводит к ошибкам разбора для меня.

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

Ответы [ 4 ]

12 голосов
/ 25 мая 2011

Ссылка, которую вы предоставили, описывает предложение, которое звучит так, будто оно не является частью стандарта Haskell (хотя в ссылке упоминается, что оно реализовано в jhc, GHC и Hugs). Возможно, используемая вами версия компилятора Haskell или набор используемых вами флагов не допускают поведения необязательной точки с запятой, описанного в ссылке.

Попробуйте это:

import System.Environment
main = do
    args <- getArgs
    if (args !! 0) == "hello" then
        print "hello"
        else
            print "goodbye"
5 голосов
/ 25 мая 2011

В Haskell 98 «если… то… еще…» - это одно выражение . Если он разбит на несколько строк, те, которые следуют за первой, должны быть с отступом.

Так же, как следующее неверно ...

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».

3 голосов
/ 25 мая 2011

Синтаксис и язык Haskell расширены с помощью прагм {- # LANGUAGE ... # -} в начале исходных файлов . Расширение DoAndIfThenElse распознается, поскольку оно является одним из перечисленных в документации Cabal . Текущий GHC включает это по умолчанию.

2 голосов
/ 25 мая 2011

Я обычно делаю отступ на else на один пробел больше, чем if. Если только тогда целое if не помещается на одной строке.

...