<div dir="ltr"><div>The package name + module name is always unique in every Haskell program, module names can not be duplicated in a package and package names are unique also.<br></div><div>There are 2 kinds of identifiers, local and exported.</div><div>You can construct a whole program unique name for:</div><div><ul><li>exported identifier with combining the package name + module name + occurence name (without the unique value)</li><li>local identifier with combining the package name + module name + occurence name + unique (what is unique per invocation)</li></ul></div><div>It is safe because only the exported names can appear in an external expression and those do not contain the GHC's unique value.</div><div>Just think about how the object code linker deals with GHC symbols.</div><div><br></div><div>Cheers,</div><div>Csaba<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, Dec 1, 2018 at 1:23 PM Christopher Done <<a href="mailto:chrisdone@gmail.com">chrisdone@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think what Csaba means is that we can have e.g.<br>
<br>
* GHC invocation 1<br>
  * ghc-prim:<br>
    * MyModule.foo has Unique 123<br>
    * OtherModule.bar has Unique 124<br>
* GHC invocation 2<br>
  * base:<br>
    * MyMod.mu has Unique 123<br>
    * OtherMod.zot has Unique 124<br>
<br>
For a unique reference then, we just need:<br>
<br>
* ghc-prim:MyMobile.foo+123<br>
* ghc-prim:OtherModule.bar+124<br>
* base:MyMod.mu+123<br>
* base:OtherMod.zot+124<br>
<br>
For any local lookup this is reliable. If the lookup fails, a lookup<br>
without the Unique works for cross-module lookups.<br>
</blockquote></div>