[GHC] #6018: Injective type families

GHC ghc-devs at haskell.org
Tue Sep 9 15:52:45 UTC 2014


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

Comment (by goldfire):

 A conversation with Ulf Norell (the first implementor of Agda) led to this
 interesting thought: We may not want injectivity -- we may want a weaker
 property, which I'll term "head-injectivity".

 The equations defining a head-injective function all have RHSs with
 different heads. What appears below the heads does not matter. Here is an
 example:

 {{{#!hs
 type family F a where
   F (Just x) = True
   F Nothing  = False
 }}}

 This function is ''not'' injective: `F (Just 1) ~ F (Just 2)`. Yet, it is
 head-injective. If the type-inferencer knows that `F x ~ True`, it can
 then refine `x ~ Just y` for some fresh unification variable `y`. This
 improvement may be enough to make further progress.

 Of course, injectivity does not imply head-injectivity. Consider

 {{{#!hs
   type family G a where
     G True  = Just 1
     G False = Just 2
 }}}

 This function is injective but not head-injective. So, implementing only
 head-injectivity will miss this case. But, perhaps we can refine the
 notion of head-injectivity simply to mean that the RHSs don't unify.

 The reason I'm bringing this up is that head-injectivity is, as I
 understand it, implemented in Agda and used during type inference. It
 intrigues me to think that we can make progress in the case of `F`, a non-
 injective function.

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


More information about the ghc-tickets mailing list