[Haskell-cafe] forall and a parse error

Andres Loeh loeh at iai.uni-bonn.de
Wed Nov 15 18:42:40 EST 2006


> Probably unrelated, but this thread is what triggered it for me.
> There is a minor bug in showing impredicative types without
> -fglasgow-exts: *hope I got that right*
> 
> Prelude> let x = [] :: [forall a. a]
> 
> <interactive>:1:23:
>     Warning: Accepting non-standard infix type constructor `.'
>              Use -fglasgow-exts to avoid this warning
> Prelude> :t x
> x :: [. (forall a) a]
> 
>      ^^^^^^^^^^^^^^^^

This is a minor bug, but not the one I think you mean. Look at the
message. GHC says it's accepting the non-standard infix type
constructor called `.' ... So it's really interpreting `.' as an infix
type variable. It is also interpreting `forall' as a type variable, because
without -fglasgow-exts, `forall' is not a keyword, so it's a valid variable
name. So, renaming the `.' to `x' and `forall' to `f', your expression
is equivalent to

Prelude> let x = [] :: [x (f a) a]

and that is type-correct. This is also very close to what GHC prints as
the type, namely

[. (forall a) a]

So GHC decides to put `.' in prefix position, which is ok also for infix
type operators, but you have to put them in parentheses for GHC to re-accept
the type, so the bug is that GHC should really print

[(.) (forall a) a]

as type of `x'.

Cheers,
  Andres


More information about the Haskell-Cafe mailing list