Краткая нотация if-then-else в блоках выполнения в Haskell

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

person gatoatigrado    schedule 24.05.2011    source источник
comment
Какую версию GHC вы используете? - или вы используете GHC? :)   -  person porges    schedule 25.05.2011
comment
6.12.3 (к сожалению, бинарники OpenSuSE устарели)   -  person gatoatigrado    schedule 25.05.2011
comment
Почему вы отделяете то и другое от их линий?   -  person alternative    schedule 25.05.2011
comment
К сожалению, это было исправлено в 6.13.   -  person porges    schedule 25.05.2011
comment
Я знаю, что вы, вероятно, использовали это как игрушечный пример, но придирки показывают, что вы могли бы использовать: print $ if head args == "hello" then "hello" else "goodbye"   -  person Peaker    schedule 25.05.2011
comment
@mathepic Хотя это выглядит несоответствующим, это полезно для уменьшения отступа, особенно когда нужно сделать блоки then/else блоками do (вы можете просто добавить do after then и else)   -  person gatoatigrado    schedule 25.05.2011


Ответы (4)


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

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

import System.Environment
main = do
    args <- getArgs
    if (args !! 0) == "hello" then
        print "hello"
        else
            print "goodbye"
person Zach    schedule 24.05.2011
comment
Предложение было принято в Haskell 2010. Работает без изменений на GHC 7.0.2. - person hammar; 25.05.2011
comment
Ой! Хорошо знать! Возможно, gatoatigrado использовал более старую версию GHC без ее поддержки. - person Zach; 25.05.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 позволяет ” и “else” на том же уровне отступа, что и “if”.

person ion    schedule 24.05.2011

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

person Chris Kuklewicz    schedule 25.05.2011

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

person augustss    schedule 24.05.2011