Hier ist eine einfache Funktion zu berechnen:Warum verschlechtert das Hinzufügen einer Signatur vom Typ "Polymorph" die Leistung? Fibonacci-Zahlen
fib :: [Int]
fib = 1 : 1 : zipWith (+) fib (tail fib)
In GHCI ich schnell die Serie berechnen kann. Tatsächlich zeigt ein wenig Experimentieren, dass die Berechnung in ungefähr linearer Zeit abläuft.
ghci> last $ take 100000 fib
354224848179261915075 -- takes under a second
Wenn ich die Art Signatur zu ändern, anstatt polymorph zu sein:
fib :: Num a => [a]
fib = 1 : 1 : zipWith (+) fib (tail fib)
Dann wird der Algorithmus langsamer wird. Tatsächlich scheint es jetzt in exponentieller Zeit zu laufen!
Bedeutet das Umschalten auf eine Signatur vom Typ "Polymorph", dass die Liste in jeder Phase vollständig neu berechnet wird? Wenn ja warum?
möglich Duplikat von [Wird ein Wert, der einen Typ mit Klasseneinschränkungen hat, zur Laufzeit tatsächlich eine Funktion sein?] (Http://stackoverflow.com/questions/7659845/will-a-value-that-has-a -type-with-class-constraints-tatsächlich-be-a-function-at-ru) –