В настоящее время я смотрю на эту функцию в Haskell, которая возвращает число Фибоначчи в позиции n
fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Теперь он компилируется, возвращает правильный результат и все такое... но я не понимаю, как Haskell оценивает эту функцию.
Разве Haskell не всегда ищет подходящее определение, а затем применяет это определение до тех пор, пока оно больше не сможет (например, достигнут базовый случай)?
В таком случае это то, что я придумал. Например, оценка fib 3
fib n = fib (n-1) + fib (n-2)
fib 3 = fib (3-1) + fib (3-2)
fib 3 = fib ((3-1)-1) + fib ((3-1)-2) + fib ((3-2)-1) + fib ((3-2)-2)
fib 3 = fib (((3-1)-1)-1) + fib (((3-1)-1)-2) +
fib (((3-1)-2)-1) + fib (((3-1)-2)-2) +
fib (((3-2)-1)-1) + fib (((3-2)-1)-2) +
fib (((3-2)-2)-1) + fib (((3-2)-2)-2)
...
Это может продолжаться бесконечно, не давая реального результата. Однако Haskell возвращает результат. Так что я делаю неправильно?