Type synonyms with hidden, determined type variables
I found myself wanting to write (simplified)
type MyMonad m = (MonadReader r m, Show r)
but GHC does not accept this, it wants r
as part of the type synonym. So why did I think this could work? Because MonadReader
has a functional dependency:
class Monad m => MonadReader r m | m -> r
so if m
determines r
, why do I have to write MyMonad r m
and not just MyMonad m
? Can I not “hide” the fact that, somewhere internal to the MyMonad
synonym, there is an additional variable r
around?
Clearly supporting this would need a language proposal, but I wanted to open a ticket here first to hear if this would even be possible to implement.
(Others have wanted this before as well.)
Trac metadata
Trac field | Value |
---|---|
Version | 8.5 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |