2015-02-18 2 views
2

Я рассматривал другие подобные вопросы, но я все еще не могу решить проблему здесь. Я предопределю это, сказав, что да, это домашнее задание, но я нахожусь в точке, где я не знаю, где я ошибаюсь. Задача состоит в том, чтобы переписать рекурсивный алгоритм мы были даны, что возвращает 1, если п 0, п, если п меньше 5, в противном случае это делает последнюю строку кода здесь:Синтаксис If-Else в Haskell?

alg n = if (n == 0) 
    then 1 
    else if (n<5) 
     then n 
     else alg(n-1) * alg(n-2) * alg(n-3) * alg(n-4) 

ошибки я получаю ошибка синтаксического анализа (возможно, неправильный отступ или несогласованные скобки) в WinGHCi. Я проверил множество статей о том, как правильно структурировать if-заявления в Haskell, но я все еще новичок, поэтому я понятия не имею, где я ошибаюсь. Если кто-то может сказать мне, что неверно, чтобы избежать будущих ошибок, я был бы очень благодарен.

+2

Написание кода в текстовом редакторе и импорт его в GHCI не привели к синтаксическим ошибкам для меня. Вы вводите это интерактивно в GHCI? – Jmac

+0

Я использую Notepad ++ для написания кода и WinGHCi для его выполнения. – LewisDavie

ответ

4

Нет ничего плохого в строках, которые вы написали изолированно, поскольку вы можете проверить их, скопировав их в новый исходный файл Haskell. Если GHC сообщает об ошибке на одной из этих строк, то реальная ошибка, вероятно, находится непосредственно перед этими строками, возможно, с нечеткой скобкой или if-then, не содержащей ничего или чего-то подобного.

3

Альтернативы (и, возможно, более краткий) подход можно рассматривать, используя охранников:

alg n 
    | n == 0 = 1 
    | n < 5 = n 
    | otherwise = alg(n-1) * alg(n-2) * alg(n-3) * alg(n-4) 
+1

Хотя этот ответ не ошибочен, он не затрагивает вопрос о том, почему исходная программа не компилируется, и может создать впечатление, что нужно использовать защитные устройства, а не if/then/else здесь. –

+0

Хорошо, спасибо, я уточню, что это альтернатива. – vikingsteve

-3

Ответ прямо здесь в сообщении об ошибке: ваша отступы неправильно. В частности, Вы писали

else if ... 
    then ... 
    else ... 

В then и else ключевые слова должны быть отступы дальше, чем совпадающим if ключевого слова:

else if ... 
     then ... 
     else ... 

Edit: Нет, это превращает его я ошибаюсь. Я пробовал с несколькими разными ошибками if, и все работает отлично. Я понятия не имею, какова была ваша первоначальная проблема. (? Tab символов, может быть)

Несмотря на это, поскольку @vikingsteve справедливо указывает, в этом случае вы можете сделать это лучше с узором охранниками:

alg n 
    | condition1 = ... 
    | condition2 = ... 
    | condition3 = ... 
    | condition4 = ... 

Это, как правило, гораздо более удобным для чтения, чтобы сделать это таким образом когда возможное. (Конечно, это не всегда так просто)

+0

* Далее * или в том же столбце. – Jubobs

+0

@Jubobs То же самое колонка также должна работать. – MathematicalOrchid

+2

Это неправда, отступ не играет роли в выражении 'if'. –

Смежные вопросы