[GHC] #14146: Can GHC propose kind restrictions?
GHC
ghc-devs at haskell.org
Tue Aug 22 23:44:36 UTC 2017
#14146: Can GHC propose kind restrictions?
-------------------------------------+-------------------------------------
Reporter: Iceland_jack | Owner: (none)
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.2.1
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: |
-------------------------------------+-------------------------------------
Description changed by Iceland_jack:
Old description:
> This is UX. As my code gets more polykinded I find myself in situations
> such as these all the more often
>
> {{{#!hs
> instance (Comonad f, Representable f, Comonad g, Representable g) =>
> Comonad (Compose f g) where
> extract = undefined
> duplicate = undefined
>
> instance ComonadApply (Compose f g) where
> (<@>) = undefined
> }}}
>
> {{{
> /tmp/a.hs:20:10-35: error:
> • No instance for (Comonad (Compose f g))
> arising from the superclasses of an instance declaration
> • In the instance declaration for ‘ComonadApply (Compose f g)’
> |
> 20 | instance ComonadApply (Compose f g) where
> | ^^^^^^^^^^^^^^^^^^^^^^^^^^
> Failed, modules loaded: none.
> }}}
>
> It would help me if GHC looked up a `Comonad (Compose _ _)` instance,
> compared the kinds
>
> {{{#!hs
> Comonad (Compose (f :: Type -> Type) (g :: Type -> Type) :: Type ->
> Type)
> ComonadApply (Compose (f :: k -> Type) (g :: Type -> k) :: Type ->
> Type)
> }}}
>
> a simple suggestion like this would be helpful
>
> {{{
> • No instance for (Comonad (Compose f g))
> arising from the superclasses of an instance declaration
> Try adding a kind signature (ComonadApply (Compose (f :: Type ->
> Type) g)).
> }}}
>
> Even more amazing would be
>
> {{{
> • No instance for (Comonad (Compose f g))
> arising from the superclasses of an instance declaration
> Try adding a context
> (Comonad f, Representable f, Comonad g, Representable g)
> => ComonadApply (Compose f g)
> }}}
>
> Which the compiler could in theory guess, since following GHC's
> suggestion iteratively you end up with
>
> {{{#!hs
> ComonadApply (Compose (f :: Type -> Type) g)
>
> -- ==> add (Comonad f) to the context of the instance declaration
> Comonad f => ComonadApply (Compose f g)
>
> -- ==> add (Comonad g) to the context of the instance declaration
> (Comonad f, Comonad g) => ComonadApply (Compose f g)
>
> -- ==> add (Representable f) to the context of the instance declaration
> (Comonad f, Comonad g, Representable g) => ComonadApply (Compose f g)
>
> -- ==> add (Representable f) to the context of the instance declaration
> (Comonad f, Comonad g, Representable g, Representable f) => ComonadApply
> (Compose f g)
> }}}
New description:
This is UX. As my code gets more polykinded I find myself in situations
such as these all the more often
{{{#!hs
instance (Comonad f, Representable f, Comonad g, Representable g) =>
Comonad (Compose f g) where
extract = undefined
duplicate = undefined
instance ComonadApply (Compose f g) where
(<@>) = undefined
}}}
{{{
/tmp/a.hs:20:10-35: error:
• No instance for (Comonad (Compose f g))
arising from the superclasses of an instance declaration
• In the instance declaration for ‘ComonadApply (Compose f g)’
|
20 | instance ComonadApply (Compose f g) where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
Failed, modules loaded: none.
}}}
It would help me if GHC looked up a `Comonad (Compose _ _)` instance,
compared the kinds
{{{#!hs
Comonad (Compose (f :: Type -> Type) (g :: Type -> Type) :: Type ->
Type)
ComonadApply (Compose (f :: k -> Type) (g :: Type -> k) :: Type ->
Type)
}}}
a simple suggestion like this would be helpful
{{{
• No instance for (Comonad (Compose f g))
arising from the superclasses of an instance declaration
Try adding a kind signature (ComonadApply (Compose (f :: Type ->
Type) g)).
}}}
Even more amazing would be
{{{
• No instance for (Comonad (Compose f g))
arising from the superclasses of an instance declaration
Try adding a context
(Comonad f, Representable f, Comonad g, Representable g)
=> ComonadApply (Compose f g)
}}}
Which the compiler could in theory guess, since following GHC's suggestion
iteratively you end up with
{{{#!hs
ComonadApply (Compose (f :: Type -> Type) g)
-- ==> add (Comonad f) to the context of the instance declaration
Comonad f => ComonadApply (Compose f g)
-- ==> add (Comonad g) to the context of the instance declaration
(Comonad f, Comonad g) => ComonadApply (Compose f g)
-- ==> add (Representable g) to the context of the instance declaration
(Comonad f, Comonad g, Representable g) => ComonadApply (Compose f g)
-- ==> add (Representable f) to the context of the instance declaration
(Comonad f, Comonad g, Representable g, Representable f) => ComonadApply
(Compose f g)
}}}
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14146#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list