Warum wird dieser Haskell-Code niemals beendet?

Ich habe kürzlich Haskell-Code geschrieben, der nie endet. Nachdem ich meinen Code sorgfältig geprüft hatte, ging das Problem auf das folgende Codestück zurüc

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

Ich denke, das muss etwas mit der Faulheit von Haskell zu tun haben, da derselbe Code in OCaml endet. Allerdings, wenn ich stattdessen den folgenden Code schrieb

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

der Code würde kein Problem haben, überhaupt zu beenden. Ich kann den Grund nicht herausfinden, da im Originalcode die beiden Anführungszeichen als zwei verschiedene Variablen betrachtet werden sollten. Ich weiß nicht, warum ihre Benennung etwas mit der Semantik des Programms zu tun hat.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage