¿Por qué este código Haskell nunca termina?

Recientemente escribí un código de Haskell y nunca termina. Después de examinar cuidadosamente mi código, el problema se redujo a la siguiente pieza de código

main :: IO ()
main = print $ let a = 10 in
               let a = a in
               a :: Int

Supongo que esto debe tener algo que ver con la pereza de Haskell ya que el mismo código termina en OCaml. Sin embargo, si escribí el siguiente código en su lugar

main :: IO ()
main = print $ let a = 10 in
               let b = a in
               b :: Int

el código no tendría ningún problema para finalizar. No puedo entender la razón, ya que en el código original, las dos a deben considerarse como dos variables diferentes. No sé por qué nombrarlos tiene algo que ver con la semántica del programa.

Respuestas a la pregunta(2)

Su respuesta a la pregunta