Allow PartialTypeSignatures in the instance context of a standalone deriving declaration
Currently, if you try to use a wildcard anywhere in an instance context, it will fail immediately:
$ ghci
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/rgscott/.ghci
λ> instance _ => Show (Maybe a)
<interactive>:1:10: error:
Wildcard ‘_’ not allowed
in an instance declaration for ‘Show’
But there's one situation where we could lift this restriction: the context of a standalone, derived instance declaration. That is, something like this:
deriving instance _ => Show (Maybe a)
Why? Because GHC already has the machinery needed to infer what the context should be (see this part of TcDerivInfer
), so if a user turned on PartialTypeSignatures
, GHC could just fill in the wildcard with the inferred constraints.
The implementation won't be //that// easy, however, since we'd also have to watch out for trickery such as:
deriving instance (C a, _) => C (T a b c)
I only mentioned putting wildcards in a derived instance //context//, because I think allowing the use of wildcards elsewhere in the instance head might be too difficult to deal with. I mean, how would you fill in this, for example?
instance (_ a)
This mini-feature has a very practical application: it would allow users to wield the flexibility of StandaloneDeriving
without having to manually type in the instance context every time. That is, users could type in these instances:
deriving instance _ => Data (T a b c)
deriving instance _ => Eq (T a b c)
Instead of their fully spelled-out, more laborious counterparts. This would be crucial for Template Haskell, as its ability to infer these contexts is quite limited (see #10607 (closed) for an example where this cropped up).
Idle thought: could this be generalized to work for the instance context of //any// instance declaration (and not just derived ones)? From an outside perspective, it seems like typechecking other instances would require inferring constraints in a fashion quite similar to that of derived instances. But I am not at all familiar with that part of the typechecker, so I might be totally off here.
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.1 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (Type checker) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |