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?