Indeed the type checker does not actually clone identifiers. ghc -c -ddump-rn -ddump-tc -dppr-debug Foo.hs ==================== Renamer ==================== nonrec {Foo.hs:3:1-8} main:Foo.f{v r0} main:Foo.f{v r0} = {Foo.hs:3:5-8} ghc-prim:GHC.Types.True{(w) d 6u} <> TYPE SIGNATURES ( main:Foo.f{v r0} [lid] :: ghc-prim:GHC.Types.Bool{(w) tc 3c} ) :: ghc-prim:GHC.Types.Bool{(w) tc 3c} TYPE CONSTRUCTORS COERCION AXIOMS Dependent modules: [] Dependent packages: [base, ghc-prim, integer-gmp] ==================== Typechecker ==================== {Foo.hs:3:1-8} AbsBinds [] [] [( main:Foo.f{v r0} [lid] :: ghc-prim:GHC.Types.Bool{(w) tc 3c} ) <= ( f{v a9H} [lid] :: ghc-prim:GHC.Types.Bool{(w) tc 3c} ) <>] ( main:Foo.f{v r0} [lid] :: ghc-prim:GHC.Types.Bool{(w) tc 3c} ) :: ghc-prim:GHC.Types.Bool{(w) tc 3c} [LclId] {Foo.hs:3:1-8} ( f{v a9H} [lid] :: ghc-prim:GHC.Types.Bool{(w) tc 3c} ) :: ghc-prim:GHC.Types.Bool{(w) tc 3c} [LclId] ( f{v a9H} [lid] :: ghc-prim:GHC.Types.Bool{(w) tc 3c} ) = {Foo.hs:3:5-8} ghc-prim:GHC.Types.True{(w) v 6v} <> EvBinds{} From: Edsko de Vries [mailto:edskodevries@gmail.com] Sent: 27 March 2013 14:04 To: Simon Peyton-Jones Cc: ghc-devs@haskell.org Subject: Re: Stability of Uniques So is there any way that I can see that an identifier in the renamed AST is really the same as an identifier in the typechecked AST? On Wed, Mar 27, 2013 at 1:57 PM, Simon Peyton-Jones <simonpj@microsoft.com<mailto:simonpj@microsoft.com>> wrote: Yes, locally-bound uniques change all the time, to maintain scoping hygiene. But top-level things from other modules have uniques that do not change. simon From: ghc-devs-bounces@haskell.org<mailto:ghc-devs-bounces@haskell.org> [mailto:ghc-devs-bounces@haskell.org<mailto:ghc-devs-bounces@haskell.org>] On Behalf Of Edsko de Vries Sent: 26 March 2013 15:05 To: ghc-devs@haskell.org<mailto:ghc-devs@haskell.org> Subject: Stability of Uniques Hi all, Consider the very simple test module Test2 where f = True When walking the AST after renaming I see that f has unique 1912603236 and True has unique 905969694. However, when walking the typechecked AST f seems to have unique 1627390565 instead. Should I expect that the unique associated with identifiers changes between renaming and typechecking? Or is there something else that I'm missing? Thanks! Edsko