Aquí es una función simple para calcular los números de Fibonacci:¿Por qué la adición de una firma de tipo polimórfico degrada el rendimiento?
fib :: [Int]
fib = 1 : 1 : zipWith (+) fib (tail fib)
En ghci puedo calcular la serie rápidamente. De hecho, un poco de experimentación revela que el cálculo se ejecuta en tiempo aproximadamente lineal.
ghci> last $ take 100000 fib
354224848179261915075 -- takes under a second
si cambio de la firma de tipo a ser polimórficos en su lugar:
fib :: Num a => [a]
fib = 1 : 1 : zipWith (+) fib (tail fib)
A continuación, el algoritmo se vuelve más lento. De hecho, parece que ahora se ejecuta en tiempo exponencial.
¿Cambiar a una firma de tipo polimórfico significa que la lista se vuelve a calcular por completo en cada etapa? Si es así, ¿por qué?
posible duplicado de [¿Será un valor que tiene un tipo con restricciones de clase en realidad una función en tiempo de ejecución?] (Http://stackoverflow.com/questions/7659845/will-a-value-that-has-a -type-with-class-constraints-actually-be-a-function-at-ru) –