Inferred context depends on whether instances are in scope
Consider the following program, I expect e1
and e2
to have contexts MyEq a
and Eq a
respectively.
{-# OPTIONS -fno-warn-redundant-constraints #-}
{-# LANGUAGE DatatypeContexts #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
module T4966_Mod where
class MyEq w where
meq :: w -> w -> Bool
-- A bizarre instance decl!
-- People who use instance decls like this are asking for trouble
instance {-# OVERLAPPABLE #-} GUIObject w => MyEq w where
w1 `meq` w2 = toGUIObject w1 `meq` toGUIObject w2
instance {-# OVERLAPPABLE #-} GUIObject w => Eq w where
w1 == w2 = toGUIObject w1 == toGUIObject w2
class GUIObject w where
toGuiObject :: w -> Bool
e1 :: _ => a-> Bool
e1 state = state `meq` state
e2 :: _ => a-> Bool
e2 state = state == state
Compiling this program gives:
T4966_Mod.hs:24:7: error:
• Found extra-constraints wildcard standing for ‘GUIObject a’
Where: ‘a’ is a rigid type variable bound by
the inferred type of e1 :: GUIObject a => a -> Bool
at T4966_Mod.hs:24:1-19
To use the inferred type, enable PartialTypeSignatures
• In the type signature: e1 :: _ => a -> Bool
T4966_Mod.hs:27:7: error:
• Found extra-constraints wildcard standing for ‘Eq a’
Where: ‘a’ is a rigid type variable bound by
the inferred type of e2 :: Eq a => a -> Bool
at T4966_Mod.hs:27:1-19
To use the inferred type, enable PartialTypeSignatures
• In the type signature: e2 :: _ => a -> Bool
The context for e1
is simplified because there are no instances for MyEq
in scope other than the instance defined in this module. The instance for e2
is not simplified because there are many instances for E2
in scope.
Related to #4966 (closed)