[GHC] #8984: Improve output of failed GeneralizedNewtypeDeriving coercion due to type roles
GHC
ghc-devs at haskell.org
Fri Apr 11 07:03:34 UTC 2014
#8984: Improve output of failed GeneralizedNewtypeDeriving coercion due to type
roles
--------------------------------------------+------------------------------
Reporter: haasn | Owner:
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler (Type checker) | Version: 7.8.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: None/Unknown | Unknown/Multiple
Test Case: | Difficulty: Unknown
Blocking: | Blocked By:
| Related Tickets:
--------------------------------------------+------------------------------
Description changed by simonpj:
Old description:
> When trying to build acme-schoenfinkel (as an example), I came across an
> error like this:
>
> {{{
> Control/Category/Schoenfinkel.hs:66:48:
> Could not coerce from ‘cat (cat b c,
> b) c’ to ‘cat (WrappedSchoenfinkel cat b
> c, b) c’
> because ‘cat (cat b c, b) c’ and ‘cat (WrappedSchoenfinkel cat b c,
> b) c’ are different types.
> arising from the coercion of the method ‘app’ from type
> ‘forall b c. cat (cat b c, b) c’ to type
> ‘forall b c.
> WrappedSchoenfinkel cat (WrappedSchoenfinkel cat b c,
> b) c’
> Possible fix:
> use a standalone 'deriving instance' declaration,
> so you can specify the instance context yourself
> When deriving the instance for (ArrowApply
> (WrappedSchoenfinkel cat))
> }}}
>
> It was not immediately clear to me as a user that this was caused due to
> it wanting GNT which was now being blocked by type roles (rightfully so,
> as this instance allows UnsafeCoerce!), and beyond that, what the
> specific rule that triggered this was.
>
> In this case the failure is due to `WrappedSchoenfinkel cat b c` not
> being nominally equal to `cat b c`, in the type `(WrappedSchoenfinkel cat
> b c, b)`, which is required to be nominally equal to `(cat b c, b)`
> because it's used as a parameter to the variable `cat`.
>
> Printing a location breakdown and context information similar to this to
> the user would help understanding and debugging roles a lot.
New description:
When trying to build acme-schoenfinkel (as an example), I came across an
error like this:
{{{
Control/Category/Schoenfinkel.hs:66:48:
Could not coerce from ‘cat (cat b c,
b) c’ to ‘cat (WrappedSchoenfinkel cat b
c, b) c’
because ‘cat (cat b c, b) c’ and ‘cat (WrappedSchoenfinkel cat b c,
b) c’ are different types.
arising from the coercion of the method ‘app’ from type
‘forall b c. cat (cat b c, b) c’ to type
‘forall b c.
WrappedSchoenfinkel cat (WrappedSchoenfinkel cat b c,
b) c’
Possible fix:
use a standalone 'deriving instance' declaration,
so you can specify the instance context yourself
When deriving the instance for (ArrowApply
(WrappedSchoenfinkel cat))
}}}
It was not immediately clear to me as a user that this was caused due to
it wanting GNT which was now being blocked by type roles (rightfully so,
as this instance allows `UnsafeCoerce`!), and beyond that, what the
specific rule that triggered this was.
In this case the failure is due to `WrappedSchoenfinkel cat b c` not being
nominally equal to `cat b c`, in the type `(WrappedSchoenfinkel cat b c,
b)`, which is required to be nominally equal to `(cat b c, b)` because
it's used as a parameter to the variable `cat`.
Printing a location breakdown and context information similar to this to
the user would help understanding and debugging roles a lot.
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8984#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list