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