[GHC] #8338: Incoherent instances without -XIncoherentInstances
GHC
ghc-devs at haskell.org
Fri Sep 20 22:58:39 CEST 2013
#8338: Incoherent instances without -XIncoherentInstances
-------------------------------------+------------------------------------
Reporter: goldfire | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.3
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Difficulty: Unknown
Test Case: | Blocked By:
Blocking: | Related Tickets:
-------------------------------------+------------------------------------
Comment (by goldfire):
It's not clear where the error is among these files. Here are arguments
for or against various places:
1. ''The error is the definition of `ShowInstFor`.'' Packaging up an
instance may be awkward, but I think it's useful enough not to ban
outright.
2. ''The error is the definition of `incoherent`.'' This function has
access to multiple instances of the same type, so how is it to choose
among them? But, by making this definition an error, we potentially rule
out various desirable programs that operate over datatypes that package
instances. Because there's no way to pattern-match on a constructor
''without'' making the instance available, these program would become very
awkward to write.
3. ''The error is in the type of `fromB`.'' It could be argued that the
type of `fromB` should be `Show One => ShowInstFor One`, thus requiring a
coherent instance for `Show One` at any use of `fromB`. This seems
awkward, and makes the new, constructor-based constraints feel like the
old, stupid, datatype-based constraints.
4. ''The error is in the import statements of module `D`.'' We could
prohibit importing two modules that export conflicting instances. But,
that would cause interoperability problems between different
modules/packages that define overlapping instances. And, without a way to
control instance import / export, it would be impossible to rectify this
problem.
5. ''There is no error here, just a silly programmer.'' I find this
dissatisfying, because it is reasonable for a programmer to assume
coherence of instances. Yes, this program is silly, indeed, but I feel
like dismissing it is somehow weakening Haskell's claim to offer coherence
unless the programmer uses "dangerous" extensions, like
`OverlappingInstances` or `IncoherentInstances`.
6. ''This is a feature, not a bug.'' We could say that the program above
behaves as expected. If this is the case, we need to document the behavior
and then maintain it, which I don't think will be particularly easy.
So, what to do? I don't honestly know! It may perhaps be best to let
sleeping dogs lie (essentially, option 5), but I wanted to document the
problem. I should also note that, in GHC 7.8, this becomes much more
apparent, because `Coercible` allows you to do this in just one module! To
wit:
{{{
{-# LANGUAGE GADTs #-}
module G where
import GHC.Exts
data One = One
instance Show One where
show _ = "datatype One"
newtype Two = MkTwo One
instance Show Two where
show _ = "datatype Two"
data ShowInstFor a = Show a => MkSIF
showOne :: ShowInstFor One
showOne = MkSIF
showTwo :: ShowInstFor Two
showTwo = coerce showOne
incoherent :: ShowInstFor Two -> String
incoherent MkSIF = show (MkTwo One)
}}}
GHCi reports that `incoherent showTwo` is `"datatype One"` and `incoherent
MkSIF` is `"datatype Two"`. Yikes!
It might also be worth noting that HEAD produces the opposite output on
the original program from 7.6.3 -- the `B` and `C` are reversed in the
output.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8338#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list