Por que adicionar uma assinatura do tipo polimórfico reduz o desempenho?

Aqui está uma função simples para calcular números de Fibonacci:

fib :: [Int]
fib = 1 : 1 : zipWith (+) fib (tail fib)

No ghci eu posso calcular a série rapidamente. De fato, um pouco de experimentação revela que o cálculo é executado em tempo aproximadamente linear.

ghci> last $ take 100000 fib
354224848179261915075         -- takes under a second

Se eu alterar a assinatura do tipo para ser polimórfico:

fib :: Num a => [a]
fib = 1 : 1 : zipWith (+) fib (tail fib)

Então o algoritmo fica mais lento. Na verdade, parece que agora corre em tempo exponencial!

A mudança para uma assinatura do tipo polimórfico significa que a lista é totalmente recomputada em cada estágio? Se sim, porque?

questionAnswers(2)

yourAnswerToTheQuestion