[GHC] #15033: ScopedTypeVariable and RankNTypes don't scope throughout function body

GHC ghc-devs at haskell.org
Sat Apr 14 13:40:55 UTC 2018


#15033: ScopedTypeVariable and RankNTypes don't scope throughout function body
-------------------------------------+-------------------------------------
        Reporter:  parsonsmatt       |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.2.2
      Resolution:  invalid           |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by RyanGlScott):

 * status:  new => closed
 * resolution:   => invalid


Comment:

 This is by design. If you want to make a type variable scope over the body
 of a function, it must be quantified by the outermost, syntactically
 visible `forall` of the type signature. Per the
 [http://git.haskell.org/ghc.git/blob/fea04defa64871caab6339ff3fc5511a272f37c7:/docs/users_guide/glasgow_exts.rst#l9896
 users' guide]:

 > The type variable is quantified by the single, syntactically visible,
 outermost `forall` of the type signature. For example, GHC will reject all
 of the following examples:
 >
 >       {{{#!hs
 >       f1 :: forall a. forall b. a -> [b] -> [b]
 >       f1 _ (x:xs) = xs ++ [ x :: b ]
 >
 >       f2 :: forall a. a -> forall b. [b] -> [b]
 >       f2 _ (x:xs) = xs ++ [ x :: b ]
 >
 >       type Foo = forall b. [b] -> [b]
 >
 >       f3 :: Foo
 >       f3 (x:xs) = xs ++ [ x :: b ]
 >       }}}
 >
 > In `f1` and `f2`, the type variable `b` is not quantified by the
 outermost `forall`, so it is not in scope over the bodies of the
 functions. Neither is `b` in scope over the body of `f3`, as the `forall`
 is tucked underneath the `Foo` type synonym.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15033#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list