Подтвердить что ты не робот

Взаимная рекурсия в нечетных/четных функциях в 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.

Почему я получаю это сообщение? Является ли код синтаксически устаревшим или чем-то?

4b9b3361

Ответ 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.