Haskell: wersja rekursji głębi drzewa binarnego

Przede wszystkim mam dwie różne implementacje, które moim zdaniem są poprawne, i wyprofilowałem je i myślę, że dotyczą one tej samej wydajności:

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 

Zastanawiałem się tylko, czy ludzie nie mówią o tym, jak rekursja ogona może być korzystna dla wydajności? I wiele pytań wskakuje mi do głowy:

Jak można sprawić, aby głębokość działała szybciej?Czytałem o czymś, jak lenistwo Haskella może zmniejszyć potrzebę rekurencji ogonowej, czy to prawda?Czy to prawda, że ​​każda rekurencja może zostać przekształcona w rekursję ogonową?Wreszcie rekursja ogonowa może być szybsza i wydajniejsza, ponieważ można ją przekształcić w pętle, a tym samym zmniejszyć potrzebę pchania i wyrzucania stosu, czy mam rację?

questionAnswers(3)

yourAnswerToTheQuestion