Skip to content

ScopedTypeVariable and RankNTypes don't scope throughout function body

I'm writing a DSL that uses TypeApplications, and I noticed the following weird behavior with ScopedTypeVariables and AllowAmbiguousTypes.

You can define a function that takes the TypeApplication after a parameter:

lol :: String -> forall a. IO ()
lol str = putStrLn str

main = lol "hello" @Int

This works! Unfortunately, it is impossible to *refer* to that a type variable in the body of the function. It is as though ScopedTypeVariables were not turned on.

A reproduction (tested on 8.2.2 and 8.4.1):

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}

import Data.Typeable
import Data.Proxy

no :: String -> forall x. Typeable x => IO ()
no _ = print (typeRep (Proxy :: Proxy x))

yes :: forall x. Typeable x => String -> IO ()
yes _ = print (typeRep (Proxy :: Proxy x))

no fails to compile, saying that x type variable is not in scope. yes works just fine.

Trac metadata
Trac field Value
Version 8.2.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information