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
?