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?