[GHC] #15579: topNormaliseType is wrong

GHC ghc-devs at haskell.org
Thu Sep 13 22:14:13 UTC 2018


#15579: topNormaliseType is wrong
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  goldfire
            Type:  bug               |               Status:  new
        Priority:  highest           |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.4.3
      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 flip101:

Old description:

> I’m very puzzled about topNormaliseTYpe_maybe.  Here it is:
> {{{
> topNormaliseType_maybe env ty
>   = topNormaliseTypeX stepper mkTransCo ty
>   where
>     stepper = unwrapNewTypeStepper `composeSteppers` tyFamStepper
>
>     tyFamStepper rec_nts tc tys  -- Try to step a type/data family
>       = let (args_co, ntys) = normaliseTcArgs env Representational tc tys
> in
>           -- NB: It's OK to use normaliseTcArgs here instead of
>           -- normalise_tc_args (which takes the LiftingContext described
>           -- in Note [Normalising types]) because the reduceTyFamApp
> below
>           -- works only at top level. We'll never recur in this function
>           -- after reducing the kind of a bound tyvar.
>
>         case reduceTyFamApp_maybe env Representational tc ntys of
>           Just (co, rhs) -> NS_Step rec_nts rhs (args_co `mkTransCo` co)
>           _              -> NS_Done
> }}}
> I have two puzzlements
>
> 1. First, it seems utterly wrong to normalise the arguments using
> Representational.  Consider
> {{{
> F (N Int)
> where newtype N x = [x]
> }}}
>    We don’t want to reduce `(N Int)` to `[Int]`, and then try reducing
> `(F [Int])`!!   That is totally bogus.  Surely we should use (the role-
> aware) `normalise_tc_args` here?
>
> 2. I have literally no clue what `Note [Normalising types]` is all about.
> Moreover there is no Lifting Context passed to `normalise_tc_args`, so I
> don’t know what this stuff about `LiftingContext` is about. Is this
> historical baggage?
>
> Richard and I discussed this. (1) is a bug; for (2) the comment is
> misleading and should be deleted.
>
> Richard will do these things -- and will add examples to the mysterious
> `Note [Normalising types]`

New description:

 I’m very puzzled about topNormaliseTYpe_maybe.  Here it is:
 {{{#!haskell
 topNormaliseType_maybe env ty
   = topNormaliseTypeX stepper mkTransCo ty
   where
     stepper = unwrapNewTypeStepper `composeSteppers` tyFamStepper

     tyFamStepper rec_nts tc tys  -- Try to step a type/data family
       = let (args_co, ntys) = normaliseTcArgs env Representational tc tys
 in
           -- NB: It's OK to use normaliseTcArgs here instead of
           -- normalise_tc_args (which takes the LiftingContext described
           -- in Note [Normalising types]) because the reduceTyFamApp below
           -- works only at top level. We'll never recur in this function
           -- after reducing the kind of a bound tyvar.

         case reduceTyFamApp_maybe env Representational tc ntys of
           Just (co, rhs) -> NS_Step rec_nts rhs (args_co `mkTransCo` co)
           _              -> NS_Done
 }}}
 I have two puzzlements

 1. First, it seems utterly wrong to normalise the arguments using
 Representational.  Consider
 {{{#!haskell
 F (N Int)
 where newtype N x = [x]
 }}}
    We don’t want to reduce `(N Int)` to `[Int]`, and then try reducing `(F
 [Int])`!!   That is totally bogus.  Surely we should use (the role-aware)
 `normalise_tc_args` here?

 2. I have literally no clue what `Note [Normalising types]` is all about.
 Moreover there is no Lifting Context passed to `normalise_tc_args`, so I
 don’t know what this stuff about `LiftingContext` is about. Is this
 historical baggage?

 Richard and I discussed this. (1) is a bug; for (2) the comment is
 misleading and should be deleted.

 Richard will do these things -- and will add examples to the mysterious
 `Note [Normalising types]`

--

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


More information about the ghc-tickets mailing list