Recursión de la cola en Haskell

Estoy tratando de entender la recursividad de la cola en Haskell. Creo que entiendo qué es y cómo funciona, pero me gustaría asegurarme de que no estoy estropeando las cosas.

Aquí está la definición factorial "estándar":

factorial 1 = 1
factorial k = k * factorial (k-1)

Cuando se ejecuta, por ejemplo,factorial 3, mi función se llamará a sí misma 3 veces (darle o tomar). Esto podría plantear un problema si quisiera calcular el factorial 99999999 ya que podría tener un desbordamiento de pila. Después de llegar afactorial 1 = 1 Tendré que "volver" en la pila y multiplicar todos los valores, por lo que tengo 6 operaciones (3 para llamar a la función en sí y 3 para multiplicar los valores).

Ahora les presento otra posible implementación factorial:

factorial 1 c = c
factorial k c = factorial (k-1) (c*k)

Este también es recursivo. Se llamará a sí mismo 3 veces. Pero no tiene el problema de tener que "regresar" para calcular las multiplicaciones de todos los resultados, ya que ya paso el resultado como argumento de la función.

Esto es, por lo que he entendido, de lo que trata Tail Recursion. Ahora, parece un poco mejor que el primero, pero aún puede tener desbordamientos de pila tan fácilmente. Escuché que el compilador de Haskell convertirá las funciones recursivas de cola en bucles detrás de escena. Supongo que esa es la razón por la que vale la pena hacer funciones recursivas de cola.

Si esa es la razón, entonces no hay absolutamente ninguna necesidad de tratar de hacer que las funciones sean recursivas si el compilador no va a hacer este truco inteligente: ¿estoy en lo cierto? Por ejemplo, aunque en teoría el compilador de C # podría detectar y convertir funciones recursivas de cola en bucles, sé (al menos es lo que he escuchado) que actualmente no hace eso. Por lo tanto, no tiene absolutamente ningún sentido hacer que las funciones sean recursivas. ¿Es asi?

¡Gracias!