
So I think everything is behaving as designed there. (You may want to
#12085: Premature defaulting and variable not in scope -------------------------------------+------------------------------------- Reporter: Iceland_jack | Owner: Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.0.1 Resolution: | Keywords: | TypeApplications Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Iceland_jack): Ah they are both by design, interesting! Replying to [comment:1 simonpj]: propose a design change.) If I were to propose one, it would look something like this: {{{ ghci> :type todo todo :: String ghci> :set -XAllowAmbiguousTypes ghci> :type todo todo :: forall a. (Read a, Show a) => String }}} I haven't read #11376 (as well as being out of my depth) so I defer to the judgment of GHC developers. ---- Replying to [comment:2 simonpj]:
For the second, a type signature brings into scope ''only'' the type variables in the ''leading'' or top-level `forall`. So in
I'm not familiar with the terminology, what is a ‘''leading''’ forall?
But for ''non-top-level'' foralls, nothing is brought into scope
`[…]`
This is again by design, and I think it's documented.
Searching for “''non-top-level'' foralls” only gives this thread, I guess there isn't a formal name for it. I found these references in the user guide
`[…]` it is possible to declare type arguments somewhere other than the beginning of a type” regarding `RankNTypes`.
That is, you can nest foralls arbitrarily deep in function arrows
The `-XRankNTypes` option is also required for any type with a forall or context to the right of an arrow (e.g. `f :: Int -> forall a. a->a`, or `g :: Int -> Ord a => a -> a`).
but I didn't find information about scoping. Is there a fundamental reason this couldn't work: {{{#!hs one :: forall a. Int -> ... one in_scope = {- ‘a’ is in scope -} two :: Int -> forall a. ... two not_in_scope = {- ‘a’ is in scope -} }}} This is not a feature I desperately need -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12085#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler