[GHC] #9334: Implement "instance chains"
GHC
ghc-devs at haskell.org
Sun Jul 20 19:16:58 UTC 2014
#9334: Implement "instance chains"
-------------------------------------+-------------------------------------
Reporter: diatchki | Owner: diatchki
Type: feature | Status: new
request | Milestone:
Priority: normal | Version: 7.9
Component: Compiler | Keywords:
(Type checker) | Operating System: Unknown/Multiple
Resolution: | Type of failure: None/Unknown
Differential Revisions: | Test Case:
Architecture: | Blocking:
Unknown/Multiple |
Difficulty: Unknown |
Blocked By: |
Related Tickets: |
-------------------------------------+-------------------------------------
Comment (by diatchki):
Actually, there is no requirement that an instance chain be closed and, in
fact, I was thinking of just starting with open ones. Of course, one
could do the same sort of encoding using open TFs.
However, the encoding does not fully subsume instance chains. For
example, using instance chains I could write instances like these:
{{{
instance Show (MyContainer Char) where ...
else Show a => Show (MyContainer a) where ...
}}}
I couldn't do this with the encoding because the `Show` class does not
have the extra parameter that would be needed.
Not only is the encoding not pretty (imagine the type error you'd get for
a missing instance), but using it requires enabling some fancy machinery
(TFs, which pulls in FC, and reasoning about equality, etc.). Of course,
we already have all this, but somehow it feels like implementing an easy
idea, using some very advanced tools and, perhaps, it is better if we do
not entangle these two.
As for point (2), instance chains pretty much cover all the situations
where ''I'' have wanted to use overlap (note the emphasis on ''I'' :-).
For example, I wouldn't provide a global "default" instance, because it is
too error prone. For the sake of concreteness, here is what I am
referring to:
{{{
class MyShow a where myShow :: a -> String
-- default instance
instance {-# OVERLAP #-} MyShow a where myShow _ = "(can't show this)"
showInParens x = "(" ++ myShow x ++ ")"
}}}
In this example, `showInParens` would very likely not do what we intended,
because it will commit to the "default" instance prematurely. Of course,
this is just one example, but I think it is fairly representative of the
difficulties inherent in using cross-module overlapping instances.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9334#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list