[GHC] #15813: -Wredundant-constrains emits warning even if constraint is narrowing type

GHC ghc-devs at haskell.org
Fri Oct 26 21:56:57 UTC 2018


#15813: -Wredundant-constrains emits warning even if constraint is narrowing type
-------------------------------------+-------------------------------------
        Reporter:  jvanbruegge       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.6.1
      Resolution:                    |             Keywords:
Operating System:  Linux             |         Architecture:  x86_64
 Type of failure:  Incorrect         |  (amd64)
  error/warning at compile-time      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by jvanbruegge:

Old description:

> I am not sure if this is the same as #12700 , but when having a
> constraint that uses type equality to narrow down a type, -Wredundant-
> constraints still emits the warning. My particular example is:
>
> {{{#!hs
> class RowCons (label :: Symbol) (ty :: k) (tail :: Row k) (row :: Row k)
>         | label row -> ty tail, label ty tail -> row
>
> instance (RowDelete s r ~ tail, RowPrepend s ty tail ~ r) => RowCons s ty
> tail r
>

> get :: forall s ty t r. RowCons s ty t r => Record r -> Proxy s -> ty
> get _ _ = undefined
>

> test_rec = get (Proxy :: Record ('Cons "foo" '[String]) (Proxy :: Proxy
> "foo")
> }}}
> With the RowCons constraint, the inferred type of test_rec is String (or
> [Char]), but without it it is an ambiguous `ty`.
>
> If the implementation of the type classes is needed, they can be found
> here:
> https://github.com/jvanbruegge/Megarecord/blob/f65fa5f29dc393e32d42fc87872416ec02405784/src/Megarecord.hs
>
> I tested this with 8.6.1 and 8.4.3

New description:

 I am not sure if this is the same as #12700 , but when having a constraint
 that uses type equality to narrow down a type, -Wredundant-constraints
 still emits the warning. My particular example is:

 {{{#!hs
 class RowCons (label :: Symbol) (ty :: k) (tail :: Row k) (row :: Row k)
         | label row -> ty tail, label ty tail -> row

 instance (RowDelete s r ~ tail, RowPrepend s ty tail ~ r) => RowCons s ty
 tail r


 get :: forall s ty t r. RowCons s ty t r => Record r -> Proxy s -> ty
 get _ _ = undefined


 test_rec = get (Proxy :: Record ('Cons "foo" '[String])) (Proxy :: Proxy
 "foo")
 }}}
 With the RowCons constraint, the inferred type of test_rec is String (or
 [Char]), but without it it is an ambiguous `ty`.

 If the implementation of the type families is needed, they can be found
 here:
 https://github.com/jvanbruegge/Megarecord/blob/f65fa5f29dc393e32d42fc87872416ec02405784/src/Megarecord.hs

 I tested this with 8.6.1 and 8.4.3

--

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


More information about the ghc-tickets mailing list