2013-02-13 2 views
0

У меня есть funciton, который успешно компилируется в haskell.Функция ошибки в Haskell

Это выглядит следующим образом:

suffix :: Int -> String 
suffix i 
    | i==0     = "th" 
    | i==1     = "st" 
    | i==2     = "nd" 
    | i==3     = "rd" 
    | i>=4 || i<=9   = "th" 
    | i<0     = error "Must be positive integer"  ----------NOT WORKING? 
    | otherwise   = suffix(i `rem` 10)  

Это не работает, что я могу сказать, по крайней мере, с линией ошибки для i<0 охраны. Когда я вхожу в GHCI и добавляю «-» к числу: suffix -5 Я получаю то же сообщение об ошибке, которое я получил бы, если бы полностью оставил этот случай.

Я бы хотел, чтобы оно отображало мое сообщение об ошибке, очевидно. Надеюсь, кто-то может определить мою проблему. Благодаря!

+0

Вы могли бы выяснить это, правильно просмотрев сообщение об ошибке: это _compiler error_ и 'В уравнении для 'it': it = suffix - 5' показывает совершенно ясно, что проблема связана с' f -5' анализируется как 'f - 5'. – leftaroundabout

ответ

9

Базовый синтаксис синтаксиса Haskell. Это единственный случай, как на языке.

suffix -5 является suffix - 5 является (-) suffix 5. Символ - рассматривается как двоичный оператор infix, как и все функции пунктуации в haskell. То есть, если в выражении до - нет символов. Самый простой способ сделать то, что вам нужно, - suffix (-5). Включив его в parens, вы делаете его синтаксически автономным выражением, а это означает, что символы не предшествуют - в выражении.

Это создает свою собственную странность, тем не менее, в том, что вы не можете создать секцию оператора для вычитания значения из ввода. (-5) - это не раздел, который означает \x -> x - 5, в отличие от любого другого бинарного оператора на языке. Это своего рода неудачная ситуация, когда унарное отрицание и двоичное вычитание используют один и тот же символ, потому что это означает, что в синтаксисе Haskell должны быть такие угловые случаи, как это.

3

Когда вы пишете suffix -5, что интерпретируется как «вычесть 5 из суффикса», то есть он думает, что вы пытаетесь применить бинарный оператор - к аргументам suffix и 5. Конечно, это не сработает, потому что вы не можете вычесть число из функции.

Если вы напишете suffix (-5), он будет работать нормально.

+2

@ZAX Он не переходит в случай «в противном случае», он переходит непосредственно в 'i> = 4 || i <= 9 ', потому что' -5' действительно меньше 9. Я предполагаю, что вы имели в виду, что '||' будет '&&' там. – sepp2k

0

Haskell охранники соответствуют сверху вниз. Условие i < 0 никогда не будет соответствовать, потому что когда i меньше нуля, он сначала будет соответствовать состоянию i >= 4 || i <= 9 над ним.

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