Skip to content

Constraint order must match with RankNTypes

In the following code, GHC will not compile unless the constraints on the higher-rank function have the same *order* as the method declaration in ApPair.

{-# LANGUAGE RankNTypes #-}

class ApPair r where
  apPair :: 
    (forall a . (ApPair a, Num a) => Maybe a)
    -> Maybe r 

instance (ApPair a, ApPair b) 
 => ApPair (a,b) where
  apPair = apPair'

apPair' :: (ApPair b, ApPair c)
  => (forall a . (ApPair a, Num a) => Maybe a) -> Maybe (b,c) 
apPair' f = 
  let (Just a) = apPair f
      (Just b) = apPair f
  in Just $ (a, b)

That is, the following does *not* compile:

apPair' :: (ApPair b, ApPair c)
  => (forall a . (Num a, ApPair a) => Maybe a) -> Maybe (b,c) 
apPair' f = 
  let (Just a) = apPair f
      (Just b) = apPair f
  in Just $ (a, b)

GHC probably shouldn't care about lexical matching when checking constraints.

Trac metadata
Trac field Value
Version 7.8.4
Type Bug
TypeOfFailure OtherFailure
Priority low
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