[GHC] #6018: Injective type families

GHC ghc-devs at haskell.org
Fri Jun 6 13:07:23 UTC 2014


#6018: Injective type families
-------------------------------+-------------------------------------------
        Reporter:  lunaris     |            Owner:  simonpj
            Type:  feature     |           Status:  new
  request                      |        Milestone:  7.10.1
        Priority:  normal      |          Version:  7.4.1
       Component:  Compiler    |         Keywords:  TypeFamilies, Injective
      Resolution:              |     Architecture:  Unknown/Multiple
Operating System:              |       Difficulty:  Unknown
  Unknown/Multiple             |       Blocked By:
 Type of failure:              |  Related Tickets:  #4259
  None/Unknown                 |
       Test Case:              |
        Blocking:              |
-------------------------------+-------------------------------------------

Comment (by simonpj):

 I don't think anyone is working on injective type families right now, but
 it would make a good project, and not too difficult.

 Lunaris's patch has a lot of irrelevant white-space changes in it.  But
 the biggest problem is that I don't think it implements the all-important
 check that a injective type family really is injective. Consider
 {{{
 injective type family F a

 type instance F Int = Bool
 type instance F Char = Bool
 }}}
 This isn't injective and should jolly well be rejected.  And this should
 be the case even if the two `type instance` declarations are in different
 modules.

 Similar code already exist for rejecting type-family ''overlap''; I think
 it is in `FamInst.checkFamInstConsistency`.  But it'd need to be beefed up
 to deal with the injectiveness check.

 And you need to take care. What about
 {{{
 type instance F Int = Bool        -- (BAD)
 type instance F Char = F Int      -- (BAD)
 }}}
 The two RHSs look different, but actually they are the same.  The
 criterion for injectivity is that
 {{{
 If    (F t1 .. tn) ~ (F s1 .. sn)
 then  t1 ~ s1
       ...
       tn ~ sn
 }}}
 That doesn't hold for the (BAD) instances, so they should be rejected.  In
 the terminology of the "Closed type families" paper, we need the two RHSs
 to be '''apart'''.

 Simon

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


More information about the ghc-tickets mailing list