[Haskell-cafe] unique identity and name shadowing during type
inference
Lennart Augustsson
lennart at augustsson.net
Sat Jun 20 16:40:10 EDT 2009
Use 1. You'll probably need a monad in the type checker soon or later
anyway, e.g., for handling errors.
On Sat, Jun 20, 2009 at 7:57 PM, Geoffrey Irving<irving at naml.us> wrote:
> Hello,
>
> I am designing a type inference algorithm for a language with
> arbitrary function overloading. For various reasons (beyond the scope
> of this email), it's impossible to know the full type of an overloaded
> function, so each function is assigned a unique primitive type and the
> inference algorithm gradually learns more information about the
> primitive. For example, if we declare an identity function
>
> f x = x
>
> the algorithm will create a primitive type F, and record f :: F. If
> we use the function a few times,
>
> f 1
> f "blah"
>
> the algorithm will infer
>
> F Int = Int
> F String = String
>
> My question is: what's the best way to represent these unique
> primitive types in Haskell? A new type primitive needs to be created
> whenever we process a function declaration. Nested function
> declarations produce a different primitive each time the parent is
> invoked with different argument types. These separate primitives can
> escape if local functions are returned, so the inference algorithm
> must be able to keep them separate and learn more about them after
> their parent function is forgotten.
>
> Here are a few ways I know of:
>
> 1. Thread a uniqueness generator monad through the whole algorithm.
> I'd prefer to avoid this extra plumbing if possible.
> 2. Label primitives with the full context of how they were created.
> If function f declares a nested function g, and f is called with Int
> and Char, the primitives for g would be labeled with "f Int" and "f
> Char" to keep them separate. This is similar to lambda lifting.
> 3. Scary hacks involving makeStableName and unsafePerformIO. Some
> sort of context would have to be thrown around here to make sure GHC
> doesn't merge the different makeStableName calls.
>
> Unfortunately, method (2) is complicated by the fact that variable
> names are not unique even in the internal representation (I'm using
> the trick from [1]), so I'm not sure what the minimal unique "context"
> would be.
>
> Does anyone know other methods outside of (1), (2), or (3), or clean
> ways of structuring (2) or (3)?
>
> Thanks!
> Geoffrey
>
> [1]: http://www.haskell.org/~simonmar/bib/ghcinliner02_abstract.html
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
More information about the Haskell-Cafe
mailing list