type checking fails with a correct type

Jan Jakubuv jakubuv at gmail.com
Fri May 1 12:03:32 EDT 2009


On Thu, Apr 30, 2009 at 07:40:16PM +0200, Daniel Fischer wrote:
> 
> You can ask GHC by compiling the module without the type signature and with the flag 
> -ddump-simpl
> , the relevant part of the core is:
> 
> ==================================================================
> 
> Nonsense.nonsense :: forall t_agD s_agJ.
>                      (Nonsense.SUBST s_agJ) =>
>                      t_agD -> Data.Maybe.Maybe s_agJ
> [GlobalId]
> [Arity 2]
> Nonsense.nonsense =
>   \ (@ t_agD)                -- type of argument
>     (@ s_agJ)                -- type of result is (Maybe s_agJ)
>     ($dSUBST_agL :: Nonsense.SUBST s_agJ)   -- SUBST dictionary for s_agJ
>     (eta_shh :: t_agD) ->
>     letrec {
>       nonsense1_agA :: t_agD -> Data.Maybe.Maybe s_agJ
>       -- inner nonsense, the type is fixed as that at which the outer nonsense is called,
>       -- there is *no* forall here!
>       [Arity 1]

Thanks for you detailed explanation. Finally it makes sense ;-) It seems to
me that type inference without the type signature added an explicit type
annotation itself. So when GHCi says that

    nonsense :: SUBST s => t -> s

then it actually refers to `nonsense` in the core with added annotation and
not to the `nonsense` in the source file. I think that this confused me.

Thanks again,
  Jan.



-- 
Heriot-Watt University is a Scottish charity
registered under charity number SC000278.



More information about the Glasgow-haskell-users mailing list