Haskell: версия хвостовой рекурсии глубины бинарного дерева

Во-первых, у меня есть две разные реализации, которые я считаю правильными, и я их профилировал и думал, что они примерно одинаковой производительности:

depth::Tree a -> Int
depth Empty        = 0
depth (Branch b l r) = 1 + max (depth l) (depth r)


depthTailRec::Tree a -> Int
depthTailRec = depthTR 0 where
           depthTR d Empty          = d 
           depthTR d (Branch b l r) = let dl = depthTR (d+1) l; dr = depthTR (d+1) r in max dl dr 

Мне просто интересно, разве люди не говорят о том, как хвостовая рекурсия может быть полезна для производительности? И много вопросов прыгает в мою голову:

Как вы можете сделать функцию глубины быстрее?Я читал кое-что о том, как лень Хаскелла может уменьшить необходимость рекурсии хвоста, это правда?Правда ли, что каждая рекурсия может быть преобразована в хвостовую рекурсию?Наконец, хвостовая рекурсия может быть быстрее и экономить место, потому что она может быть превращена в петли и, таким образом, уменьшить необходимость толкать и выталкивать стек, правильно ли я понимаю?

Ответы на вопрос(3)

Ваш ответ на вопрос