Ne Haskell ont récursives terminales de l'optimisation?

J'ai découvert le "temps" commande unix aujourd'hui et j'ai pensé l'utiliser pour vérifier la différence de temps d'exécution entre la queue-récursive et normal des fonctions récursives en Haskell.

J'ai écrit les fonctions suivantes:

--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)

Ceux-ci sont valables en gardant à l'esprit qu'ils l'ont été uniquement pour une utilisation avec ce projet, donc je n'ai pas pris la peine de vérifier par des zéros ou des nombres négatifs.

Cependant, lors de l'écriture d'une méthode principale pour chacun, de les compiler et de les exécuter avec le "temps" de commande, les deux avaient les mêmes moteurs d'exécution avec la normal fonction récursive bordure de la queue récursive. Ceci est contraire à ce que j'avais entendu en ce qui concerne à la queue-récursive d'optimisation en lisp. Quelle est la raison?

  • Je crois que le coût total de possession est une optimisation pour économiser la pile des appels, cela ne signifie pas que vous allez économiser du temps CPU. Corrigez-moi si mal.
  • N'ai pas testé avec lisp, mais le tutoriel, j'ai lu implicite que la mise en place de la pile engagés coût processeur en lui-même, tandis que la compilation-à-itératif de la queue-solution récursive ne pas dépenser toute l'énergie (en temps) de faire cela et donc plus efficace.
  • eh bien cela dépend de beaucoup de choses, mais en général, les caches sont aussi en jeu, donc coût total de possession d'habitude de produire un programme plus rapide ainsi..
  • Quelle est la raison? En un mot: la paresse.
  • Fait intéressant, votre fac est plus ou moins comment ghc calcule product [n,n-1..1] à l'aide d'un auxiliaire de la fonction prod, mais bien sûr product [1..n] serait plus simple. Je ne peux que supposer qu'ils n'ont pas fait le strict dans son deuxième argument, au motif que c'est le genre de chose ghc est très confiant, il permet de compiler vers le bas pour un simple accumulateur.