Я довольно плохо знаком с Haskell, но действительно получаю большинство основ. Однако существует одна вещь, которую я просто не могу выяснить. Рассмотрите мой пример ниже:
example :: Int -> Int
example (n+1) = .....
(n+1) часть этого примера так или иначе предотвращает вход отрицательных чисел, но я не могу понять как. Например.. Если бы вход был (-5), то я ожидал бы, что n просто будет (-6), так как (-6 + 1) (-5). Вывод, когда тестирование следующие:
Ошибка в программе: отказ соответствия шаблона: пример (-5)
Кто-либо может объяснить мне, почему это не принимает отрицательные числа?
Именно так 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 ...
, чтобы достичь того же эффекта. Смысл паттерна в том, что иногда он дает сбой.