[GHC] #12919: Equality not used for substitution

GHC ghc-devs at haskell.org
Mon Dec 5 12:17:01 UTC 2016


#12919: Equality not used for substitution
-------------------------------------+-------------------------------------
        Reporter:  int-index         |                Owner:  goldfire
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:
       Component:  Compiler (Type    |              Version:  8.0.1
  checker)                           |
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * owner:   => goldfire


@@ -6,0 +6,2 @@
+ module T12919 where
+
@@ -8,1 +10,1 @@
- data N = Z
+ data Nat = Z
@@ -10,2 +12,2 @@
- data V :: N -> Type where
-   VZ :: V Z
+ data D :: Nat -> Type where
+   DZ :: D Z
@@ -13,1 +15,1 @@
- type family VC (n :: N) :: Type where
+ type family VC (n :: Nat) :: Type where
@@ -16,2 +18,2 @@
- type family VF (xs :: V n) (f :: VC n) :: Type where
-   VF VZ f = f
+ type family VF (xs :: D n) (f :: VC n) :: Type where
+   VF DZ f = f
@@ -22,1 +24,1 @@
- prop :: xs ~ VZ => Dict (VF xs f ~ f)
+ prop :: xs ~ DZ => Dict (VF xs f ~ f)

New description:

 This code

 {{{
 {-# LANGUAGE TypeInType, TypeFamilies, GADTs, ConstraintKinds #-}

 module T12919 where

 import Data.Kind

 data Nat = Z

 data D :: Nat -> Type where
   DZ :: D Z

 type family VC (n :: Nat) :: Type where
   VC Z = Type

 type family VF (xs :: D n) (f :: VC n) :: Type where
   VF DZ f = f

 data Dict c where
   Dict :: c => Dict c

 prop :: xs ~ DZ => Dict (VF xs f ~ f)
 prop = Dict
 }}}

 fails with this error:

 {{{
 Op.hs:20:8: error:
     • Couldn't match type ‘f’ with ‘VF 'VZ f’
         arising from a use of ‘Dict’
       ‘f’ is a rigid type variable bound by
         the type signature for:
           prop :: forall (xs :: V 'Z) f. xs ~ 'VZ => Dict VF xs f ~ f
         at Op.hs:19:9
     • In the expression: Dict
       In an equation for ‘prop’: prop = Dict
     • Relevant bindings include
         prop :: Dict VF xs f ~ f (bound at Op.hs:20:1)
 }}}

 However, if I substitute `xs` with `VZ` (by hand) in the type of `prop`,
 it compiles. Can be reproduced with GHC 8.0.1 but not HEAD.

--

Comment:

 Richard, could you look at this?  It's an outright bug.  I had a look and
 my brain melted.

 * We seem to be flattening a type `((f::*) |> Sym D:R:VC[0])`, where I
 think
 {{{
 axiom D:R:VC[0] :: VC Z ~ Type
 }}}
   But the result of this flattening seems to be `((f:*) |> D:R:VC[0])`,
 which is plainly wrong.

 * I don't understand the code
 {{{
 flatten_one (CastTy ty g)
   = do { (xi, co) <- flatten_one ty
        ; (g', _) <- flatten_co g
        ; return (mkCastTy xi g', castCoercionKind co g' g) }
 }}}
   It seems suspicious that the evidence returned by `flatten_co` is
 discarded.

 *  `flatten_co` is inadequately commented.  Perhaps
 {{{
   If  r is a role
       co :: s ~r t
       flatten_co co = (fco, kco)

   then
       fco :: fs ~r ft
       fs, ft are flattened types
       kco :: (fs ~r ft) ~N# (s ~r t)
 }}}
   But I'm really not sure.

 * The `flatten_one (CastTy ty g)` plan seems quite baroque when applied to
 `((f::*) |> D:R:VC[0])`.  Apparently, in `flatten_co` we
   * Take the coercion `D:R:VC[0]`, and flatten its from-type `*`, and its
 to-type `VC Z`.
   * Flattening its to-type uses `Sym D:R:VC[0]` to produce `*` again.
   * So we end up with `Refl ; D:R:VC[0] : Sym D:R:VC[0]`, which seems a
 bit of a waste.

 Generally, could you add a note about flattening `(t |> g)`?

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


More information about the ghc-tickets mailing list