Упрощенный ответ состоит в том, что примитивно-рекурсивные функции - это те, которые определены в терминах других примитивно-рекурсивных функций и рекурсии по структуре натуральных чисел. Натуральные числа концептуально таковы:
data Nat
= Zero
| Succ Nat -- Succ is short for 'successor of', i.e. n+1
Это означает, что вы можете использовать их следующим образом:
f Zero = ...
f (Succ n) = ...
Мы можем написать ваш пример как:
power2 Zero = Succ Zero -- (Succ 0) == 1
power2 (Succ n) = 2 * power2 n -- this is allowed because (*) is primitive recursive as well
Состав примитивно-рекурсивных функций также примитивно-рекурсивно.
Другой пример - числа Фибоначчи:
fib Zero = Zero
fib (Succ Zero) = (Succ Zero)
fib (Succ n@(Succ n' )) = fib n + fib n' -- addition is primitive recursive