Взаимная рекурсия в нечетных/четных функциях в haskell
В главе 6 из "Программирование в Haskell" Грэма Хаттона есть раздел под названием "6.5 Взаимная рекурсия", который содержит следующий пример:
even :: Int -> Bool
even 0 = True
even (n + 1) = odd n
odd :: Int -> Bool
odd 0 = False
odd (n + 1) = even n
Я хотел попробовать. Я поместил код в файл Hof.hs, запустил ghci (версия 7.8.3), набрал
:l Hof.hs
и получил следующее сообщение об ошибке
Hof.hs:3:7: Parse error in pattern: n + 1
Failed, modules loaded: none.
Почему я получаю это сообщение? Является ли код синтаксически устаревшим или чем-то?
Ответы
Ответ 1
n + k шаблонов были удалены из Haskell и больше недоступны. Вместо этого напишите:
even :: Int -> Bool
even 0 = True
even n = odd (n - 1)
odd :: Int -> Bool
odd 0 = False
odd n = even (n - 1)
Обратите внимание, что эта функция терпит неудачу для отрицательных входов, поэтому вы, вероятно, захотите увеличить ее с помощью abs
.