У Haskell есть хвостовая рекурсивная оптимизация?
Я обнаружил команду «time» в unix сегодня и подумал, что буду использовать ее для проверки разницы во времени выполнения между хвостовой и обычной рекурсивной функциями в Haskell.
Я написал следующие функции:
--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)
Они действительны, имея в виду, что они предназначены исключительно для использования с этим проектом, поэтому я не стал проверять наличие нулей или отрицательных чисел.
Однако после написания основного метода для каждого, компиляции и запуска их с помощью команды «time», оба имели одинаковое время выполнения собычный рекурсивная функция, вытесняющая хвостовую рекурсивную. Это противоречит тому, что я слышал о хвостовой рекурсивной оптимизации в lisp. В чем причина этого?