[Haskell-cafe] ScopedTypeVariables in let-bindings (not where-bindings!) and bug 4347

Daniel Fischer daniel.is.fischer at googlemail.com
Sat May 21 17:00:51 CEST 2011


On Saturday 21 May 2011 16:17:53, Paolo G. Giarrusso wrote:
> 
> As I said, I'm convinced that the argument of let is a pattern, on
> which a signature is allowed, and GHC correctly understands that, so
> that this declaration work:
> let (id :: Int -> Int) = \x -> x

I don't think that

Prelude> let a :: a -> a = a a

(or even

Prelude> let id2 :: t -> t = \x -> x
)

is supposed to work:

"The pattern in a pattern binding may only mention type variables that are 
already in scope."

Both are pattern bindings and the mentioned type variable is not in scope.

> 
> See both of:
> http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/other-type-extens
> ions.html#pattern-type-sigs
> http://www.haskell.org/onlinereport/decls.html#sect4.4.3.2
> 
> > This is the expected use for such thing:
> > 
> > Prelude> :s -XScopedTypeVariables
> > Prelude> let id2 :: forall t. t -> t; id2 (x :: t) = x
> 
> Why does then the following declaration work?
> let (id :: Int -> Int) = \x -> x

Because it doesn't mention any type variable.

> To me, this inconsistent behavior is a bug, and surely it is
> undesirable, because of inconsistency - the programmer needs to have
> sensible rules, about when let var : type = expr works and when not.
> Or at least a sensible error message.

The error message definitely deserves improvement.



More information about the Haskell-Cafe mailing list