Warum wirkt sich ein allgemeinerer Typ auf die Laufzeit in Haskell aus?

Betrachten Sie die beiden folgenden Implementierungen einer unendlichen Fibonacci-Sequenz:

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

fibsB :: [Integer]
fibsB = 0:1:(zipWith (+) fibsB (tail fibsB))

In GHCI, Ausführen vonfibsB !! k ist viel schneller als die Ausführung vonfibsA !! k. Insbesondere scheinen die Werte vonfibsA werden fortlaufend neu berechnet (nicht gespeichert).

Wenn die Typensignatur weggelassen wird, ist @ von GH:t zeigt es zu sein[Integer], und die Funktion wird entsprechend ausgeführt.

Dieses Verhalten tritt auch in kompiliertem Code auf ghc -O3 Fibs.hs).

Warum ist es so, dassInteger ist so viel schneller alsNum a => a?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage