Здесь простая функция для вычисления чисел Фибоначчи:
fib :: [Int]
fib = 1 : 1 : zipWith (+) fib (tail fib)
В ghci я могу быстро вычислить серию. Фактически, немного экспериментов показывает, что вычисление выполняется в приблизительно линейном времени.
ghci> last $ take 100000 fib
354224848179261915075 -- takes under a second
Если я изменю сигнатуру типа, которая будет полиморфной, вместо:
fib :: Num a => [a]
fib = 1 : 1 : zipWith (+) fib (tail fib)
Затем алгоритм становится медленнее. Фактически, кажется, что теперь он работает в экспоненциальном времени!
Переключение на подпись полиморфного типа означает, что список полностью пересматривается на каждом этапе? Если да, то почему?