Hat Haskell eine schwanzrekursive Optimierung?

Ich habe den "time" -Befehl heute in Unix entdeckt und dachte, ich würde ihn verwenden, um die Laufzeitunterschiede zwischen rekursiven und normalen rekursiven Funktionen in Haskell zu überprüfen.

Ich habe folgende Funktionen geschrieben:

--tail recursive
fac :: (Integral a) => a -> a
fac x = fac' x 1 where
    fac' 1 y = y
    fac' x y = fac' (x-1) (x*y) 

--normal recursive
facSlow :: (Integral a) => a -> a
facSlow 1 = 1
facSlow x = x * facSlow (x-1)

Diese sind gültig, wenn man bedenkt, dass sie nur für dieses Projekt bestimmt sind, also habe ich mich nicht darum gekümmert, nach Nullen oder negativen Zahlen zu suchen.

Beim Schreiben einer Hauptmethode für jede Methode, beim Kompilieren und Ausführen mit dem Befehl "time" hatten beide jedoch ähnliche Laufzeiten mit dem Befehlnormal rekursive Funktion, die den rekursiven Schwanz ausblendet. Dies steht im Widerspruch zu dem, was ich in Bezug auf die Schwanzrekursive Optimierung in Lisp gehört hatte. Was ist der Grund dafür?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage