O Haskell tem otimização recursiva de cauda?

Eu descobri o comando "time" no unix hoje e pensei em usá-lo para verificar a diferença nos tempos de execução entre funções recursivas e recursivas de cauda em Haskell.

Eu escrevi as seguintes funções:

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

Estes são válidos tendo em mente que eles eram exclusivamente para uso com este projeto, então eu não me preocupei em verificar se há zeros ou números negativos.

No entanto, ao escrever um método principal para cada um, compilando-os e executando-os com o comando "time", ambos tiveram tempos de execução similaresnormal função recursiva que retira a cauda recursiva. Isso é contrário ao que eu ouvi em relação à otimização recursiva de cauda no lisp. Qual o motivo disso?

questionAnswers(4)

yourAnswerToTheQuestion