Один из способов сделать этот вопрос Haskell заключается в том, чтобы установить задачу реализации функции Акермана (в зависимости от версии) с точки зрения «параметризма» для естественного номера, представленные здесь через Integer
, и никакой другой формы рекурсии.
paraNat :: t -> ((Integer, t) -> t) -> Integer -> t
paraNat base step n | n > 0 = step (m, paraNat base step m) where m = n - 1
paraNat base step _ = base
Это хорошо известный факт, что «paramorphism» соответствует «примитивной рекурсии», и это еще один хорошо известный факт, что функция Аккермана не в классе «примитивно рекурсивных функций». И все же проблема имеет решение. Подразумевается, что paraNat
является полиморфным по типу возврата t
, тогда как класс «примитивных функций возврата» фиксирует t
как натуральные числа.
(я понимаю, что это прикосновение неортодоксального, чтобы ответить на вопрос, излагая вопрос, но я надеюсь, что это интересно в любом случае. Я удалю этот ответ, если народные считают, что это проблематично.)
Как это проблема Haskell? –
Проверьте исходный три аргумента [функция Аккермана] (https://en.wikipedia.org/wiki/Ackermann_function)! – pigworker
как примечание 'n! ~ n^n' – Lol4t0