Skip to content

Unnecessary -XRank2Types requirement involving type alias containing "forall" from another module

The following builds with GHC 7.4, but not 7.6.

Bottom.hs

{-# LANGUAGE Rank2Types #-}
module Bottom where

type Bottom = forall a. a

data Pipe l i o u m r = Pipe
type GSource m o = forall l i u. Pipe l i o u m ()

Main.hs

import Bottom

myBottom :: Int -> Bottom
myBottom _ = error "Bottom"

main :: IO ()
main = myBottom 3

Note that Main.hs does not have the Rank2Types extension turned on.

myBottom does not have a rank-2 type. After expanding the type alias, you get:

myBottom :: Int -> forall a. a

This is logically equivalent to:

myBottom :: forall a. Int -> a

GHC 7.4.2 accepts this use of type alias, but GHC 7.6 does not.

Note that if we make something that does in fact expand to a rank-2 type:

foo :: Bottom -> Int
foo x = x

GHC 7.4.2 correctly rejects the program unless you enable Rank2Types.

Also, if we use a standalone Bottom type alias:

myBottom :: Bottom

Then GHC 7.6 accepts the program. It does not accept Int -> Bottom without Rank2Types, but it does accept Bottom by itself.

This issue is easy to work around: just add {-# LANGUAGE Rank2Types #-} or {-# LANGUAGE RankNTypes #-} to the top of the module.

Is this a bug, or have the rules for type aliases and forall been deliberately tightened?

P.S.: This ticket is for GHC 7.6.1-rc1. That version tag is not available, though.

Trac metadata
Trac field Value
Version
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