[GHC] #12114: GHC rejects injective type family

GHC ghc-devs at haskell.org
Tue May 24 20:16:12 UTC 2016


#12114: GHC rejects injective type family
-------------------------------------+-------------------------------------
           Reporter:  MikeIzbicki    |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
  (Type checker)                     |
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 The following injective type family fails to compile in GHC 8.0

 {{{
 type family Snoc (xs :: [k]) (y::k) = r | r -> xs y where
     Snoc '[]       y = '[y]
     Snoc (x ': xs) y = x ': (Snoc xs y)
 }}}

 The error message is

 {{{
     • Type family equations violate injectivity annotation:
         forall k (y :: k). Snoc '[] y = '[y] -- Defined at
 FAlgebra.hs:49:5
         forall k (xs :: [k]) (x :: k) (y :: k).
           Snoc (x : xs) y = x : Snoc xs y -- Defined at FAlgebra.hs:52:5
     • In the equations for closed type family ‘Snoc’
       In the type family declaration for ‘Snoc’
 }}}

 I think the problem is related to injectivity rule 5 from [this
 page](https://ghc.haskell.org/trac/ghc/wiki/InjectiveTypeFamilies) being
 too conservative.  In particular, if you substitute `'[]` for `Snoc xs y`
 in the RHS of the second rule, then the two rules will unify but have
 different LHSs.  This substitution is invalid, however, because the `Snoc`
 type family will never result in an empty list.

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


More information about the ghc-tickets mailing list