[GHC] #9443: Regression from 7.6.3 to 7.8.3: could not coerce because argument "has role Nominal"

GHC ghc-devs at haskell.org
Thu Aug 14 10:40:24 UTC 2014


#9443: Regression from 7.6.3 to 7.8.3: could not coerce because argument "has role
Nominal"
-------------------------------------+-------------------------------------
              Reporter:  bernalex    |            Owner:
                  Type:  bug         |           Status:  new
              Priority:  normal      |        Milestone:
             Component:  Compiler    |          Version:  7.8.3
            Resolution:              |         Keywords:
      Operating System:              |     Architecture:  x86_64 (amd64)
  Unknown/Multiple                   |       Difficulty:  Unknown
       Type of failure:  GHC         |       Blocked By:
  rejects valid program              |  Related Tickets:
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------
Description changed by bernalex:

Old description:

> This file works fine with 7.6.3:
> <https://github.com/plaimi/plailude/blob/master/src/Data/Time/Units.hs>
>
> But with 7.8.3, every newtype has an error message like:
> {{{
> Could not coerce from ‘TimeUnit Integer’ to ‘TimeUnit (Year a)’
> ||   because the first type argument of ‘TimeUnit’ has role Nominal,
> ||   but the arguments ‘Integer’ and ‘Year a’ differ
> ||   arising from the coercion of the method ‘timeVal’ from type
> ||                ‘forall n. (TimeUnit Integer, Num n) => Integer -> n’
> to type
> ||                ‘forall n. (TimeUnit (Year a), Num n) => Year a -> n’
> }}}
>
> To make the code work again, I need to remove a redundant type constraint
> from:
> {{{#!hs
> class TimeUnit t where timeVal :: (TimeUnit t, Num n) => t -> n
> }}}
>
> Turning it into:
> {{{#!hs
> class TimeUnit t where timeVal :: Num n => t -> n
> }}}
>
> The constraint is redundant because it is already implied by 'class
> TimeUnit t'.
>

> I suspect this is a regression. I would be happy to work on it, but I
> don't have time right now, so I'm putting it here for visibility,
> feedback, and to remember it in the first place.

New description:

 This file works fine with 7.6.3:
 <https://github.com/plaimi/plailude/blob/25d2a811a5d1b9b48ae8534bca10cc3798307cbc/src/Data/Time/Units.hs>

 But with 7.8.3, every newtype has an error message like:
 {{{
 Could not coerce from ‘TimeUnit Integer’ to ‘TimeUnit (Year a)’
 ||   because the first type argument of ‘TimeUnit’ has role Nominal,
 ||   but the arguments ‘Integer’ and ‘Year a’ differ
 ||   arising from the coercion of the method ‘timeVal’ from type
 ||                ‘forall n. (TimeUnit Integer, Num n) => Integer -> n’ to
 type
 ||                ‘forall n. (TimeUnit (Year a), Num n) => Year a -> n’
 }}}

 To make the code work again, I need to remove a redundant type constraint
 from:
 {{{#!hs
 class TimeUnit t where timeVal :: (TimeUnit t, Num n) => t -> n
 }}}

 Turning it into:
 {{{#!hs
 class TimeUnit t where timeVal :: Num n => t -> n
 }}}

 The constraint is redundant because it is already implied by 'class
 TimeUnit t'.


 I suspect this is a regression. I would be happy to work on it, but I
 don't have time right now, so I'm putting it here for visibility,
 feedback, and to remember it in the first place.

--

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9443#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list