Почему моя функция Haskell не принимает отрицательные числа?

Я довольно новичок в Haskell, но знаю большинство основ. Однако есть одна вещь, которую я никак не могу понять. Рассмотрим мой пример ниже:

example :: Int -> Int
example (n+1) = .....

Часть (n+1) этого примера каким-то образом предотвращает ввод отрицательных чисел, но я не могу понять, как это сделать. Например.. Если бы ввод был (-5), я бы ожидал, что n будет просто (-6), поскольку (-6 + 1) равно (-5). Вывод при тестировании следующий:

Ошибка программы: ошибка сопоставления с образцом: пример (-5)

Может ли кто-нибудь объяснить мне, почему это не принимает отрицательные числа?


person Jonathan Pike    schedule 11.02.2010    source источник
comment
Обратите внимание, что шаблоны n+k будут удалены из следующей версии спецификации языка Haskell (Haskell 2010). Насколько я знаю, на практике они используются редко (хотя, уверен, кто-то найдет анекдотический пример). Так что я бы посоветовал не использовать их.   -  person Tom Lokhorst    schedule 12.02.2010


Ответы (1)


Именно так определяются n+k шаблонов:

Сопоставление шаблона n+k (где n — переменная, а k — литерал положительного целого числа) со значением v завершается успешно, если x >= k, что приводит к привязке n к x - k, и терпит неудачу в противном случае.

Смысл шаблонов n+k заключается в выполнении индукции, поэтому вам нужно завершить пример с базовым случаем (k-1 или 0 в данном случае) и решить, будет ли параметр меньше этого быть ошибкой или нет. Как это:

example (n+1) = ...
example 0 = ...

Семантика, о которой вы, по сути, просите, была бы довольно бессмысленной и избыточной — вы могли бы просто сказать

example n = let n' = n-1 in ...

для достижения того же эффекта. Смысл шаблона в том, чтобы иногда терпеть неудачу.

person Josh Lee    schedule 12.02.2010
comment
Мой лектор использовал его, не объясняя, как и почему он работает. Вы хорошо это объяснили. Благодарю вас. - person Jonathan Pike; 12.02.2010