[Haskell-cafe] Working with the code For "Typing Haskell In Haskell"

Tom Pledger tom at pledger.gen.nz
Wed Oct 26 04:16:31 CEST 2011


Patrick LeBoutillier <patrick.leboutillier <at> gmail.com> writes:
> 
[...]
> 
> exprt = Ap (Const mapt) (Const idt)
> 
> test = runTI $ tiExpr initialEnv [] exprt
> 
> When I execute the test function above in ghci I get:
> 
> ([],TVar (Tyvar "v3" Star)).
> 
> I was expecting someting like below for the type part:
> 
> TAp tList (TGen 0) `fn` TAp tList (TGen 0)
[...]


Hi Patrick.

The short answer is that you need to use a higher-level inference function than
tiExpr.

Here's the code I ended up with:

    t4 = (putStrLn . pretty . runTI)
         (tiImpls initialEnv 
                  [mapt, idt]
                  [("map_id", [([], Var "map" `Ap` Var "id")])])

It gets the desired result:

    *PLB_thih> t4
    ([],
     ["map_id" :>:
        Forall [Star]
          ([] :=>
             (TAp tList (TGen 0) `fn` TAp tList (TGen 0)))])

Var is for referring by name to type assumptions you already have.  Const is
intended for other things such as data constructors, so I avoided it in this
case, even though Const mapt `Ap` Const idt also works.

The tiImpls function performs the 'quantify' step, which adds the Forall and
converts TVar to TGen, whereas tiExpr doesn't.  I can't see offhand why tiExpr
doesn't seem to work in isolation - but maybe that part of a Haskell typer
wouldn't work in isolation either!

Regards,
Tom





More information about the Haskell-Cafe mailing list