Ecco una semplice funzione per calcolare i numeri di Fibonacci:Perché l'aggiunta di una firma di tipo polimorfico peggiora le prestazioni?
fib :: [Int]
fib = 1 : 1 : zipWith (+) fib (tail fib)
In ghci posso calcolare la serie in fretta. In effetti, un po 'di sperimentazione rivela che il calcolo viene eseguito in un tempo approssimativamente lineare.
ghci> last $ take 100000 fib
354224848179261915075 -- takes under a second
Se cambio la firma di tipo ad essere polimorfico invece:
fib :: Num a => [a]
fib = 1 : 1 : zipWith (+) fib (tail fib)
Poi l'algoritmo diventa più lento. In effetti, sembra che ora funzioni in tempo esponenziale!
Il passaggio a una firma di tipo polimorfico significa che l'elenco viene completamente ricalcolato in ogni fase? Se è così, perché?
possibile duplicato di [Un valore con un tipo con vincoli di classe è effettivamente una funzione in fase di esecuzione?] (Http://stackoverflow.com/questions/7659845/will-a-value-that-has-a -tipo-con-classe-vincoli-effettivamente-be-a-funzione-a-ru) –