
#11999: expressing injectivity on functional dependencies gives orphan instances warnings -------------------------------------+------------------------------------- Reporter: dredozubov | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.3 Resolution: | 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: | -------------------------------------+------------------------------------- Comment (by rahulmutt):
Note [When exactly is an instance decl an orphan?] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (see MkIface.instanceToIfaceInst, which implements this) Roughly speaking, an instance is an orphan if its head (after the =>) mentions nothing defined in this module.
Functional dependencies complicate the situation though. Consider
module M where { class C a b | a -> b }
and suppose we are compiling module X:
module X where import M data T = ... instance C Int T where ...
This instance is an orphan, because when compiling a third module Y we might get a constraint (C Int v), and we'd want to improve v to T. So we must make sure X's instances are loaded, even if we do not directly use anything from X.
This part of the note explains why your example would be considered an orphan instance. Otherwise you can define instances that may not be "seen" as intended. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11999#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler