
#14288: ScopedTypeVariables with nested foralls broken since 8.0.2 -------------------------------------+------------------------------------- Reporter: MikolajKonarski | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.2.1 checker) | Resolution: | Keywords: Operating System: Linux | Architecture: x86_64 Type of failure: GHC rejects | (amd64) valid program | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): Richard and I both think we should stick with the current behaviour, and specify it in the user manual. That is, with `-XScopedTypeVariables`, and a signature {{{ f :: forall a b c. blah <definition of f> }}} then `a`, `b` and `c` scope over f's definition, but no other type variables do. This applies unconditionally, even if `blah` starts with another `forall`. The `forall` must appear literally, not hidden by a type synonym. Eg. no variables scope here {{{ type Foo = forall a b. a -> b -> Int f :: Foo f = e -- a and b are not in scope here }}} This rule is simple, and does not restrict expressiveness. Otherwise we land up trying to decide where to draw the line (and having to explain where it is drawn, in the user manual). Eg {{{ f :: forall a. forall b. blah f :: forall a. a -> forall b. blah f :: forall a. Eq a => forall b. blah }}} Would someone care to update the user manual? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14288#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler