Почему этот код на Haskell никогда не заканчивается?

Недавно я написал код на Haskell, и он никогда не заканчивается. После того, как я тщательно изучил свой код, проблема сводилась к следующему коду

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

Я предполагаю, что это как-то связано с ленью Haskell, поскольку тот же код заканчивается в OCaml. Однако, если бы я написал следующий код вместо

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

код не будет иметь проблем с завершением вообще. Я не могу понять причину, так как в исходном коде две буквы должны рассматриваться как две разные переменные. Я не знаю, почему их именование имеет какое-либо отношение к семантике программы.

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

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