Czy Haskell ma optymalizację rekurencyjną?

Odkryłem dzisiaj komendę „time” w Uniksie i pomyślałem, że użyję jej do sprawdzenia różnicy w czasie wykonywania między funkcjami rekurencyjnymi a zwykłymi w Haskell.

Napisałem następujące funkcje:

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

Są one ważne, pamiętając, że były one przeznaczone wyłącznie do użycia w tym projekcie, więc nie zawracałem sobie głowy sprawdzaniem zer lub liczb ujemnych.

Jednak po napisaniu głównej metody dla każdego z nich, skompilowaniu ich i uruchomieniu za pomocą komendy „time”, obie miały podobne środowiska wykonawcze znormalna funkcja rekurencyjna wychylająca ogon rekurencyjny. Jest to sprzeczne z tym, co słyszałem w odniesieniu do optymalizacji rekurencyjnej w seplenieniu. Jaki jest tego powód?

questionAnswers(4)

yourAnswerToTheQuestion