[GHC] #6018: Injective type families

GHC ghc-devs at haskell.org
Sat Jan 10 10:45:20 UTC 2015


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

Comment (by jstolarek):

 Replying to [comment:103 jberryman]:
 > I've only had use for better type inference with (conceptually) closed,
 recursive type families
 Calling type families from an injective type family will not be allowed
 (including recursion). The reason is that I don't see a way of verifying
 injectivity when type families are involved.

 > What I think I want is something like proposal C from the wiki
 At the moment I am implementing proposals A and B. C is something to think
 about in the future, as it is not trivial.

 > And as a naive user I want injectivity to be inferred for closed type
 families, and don't find the arguments against it in the wiki convincing.
 Yes, I suppose that focus of the wiki discussion is a bit off. I think we
 could infer injectivity of type A for closed type families. But I don't
 think we should try to infer injectivity of type B because the algorithm
 is exponential - see [comment:64 comment 64]. That's the major reason for
 doing this. (Numbers in that comment were computed for type C injectivity,
 but type B is also exponential.)

 {{{#!hs
 -- | The algebraic normal form 'Exponent' @abc@ distributed over the
 single
 -- base variable @x at .
 type family abc :=>-> x
 -- | x¹ = x
 type instance () :=>-> x = x
 -- | x⁽ᵃᵇ⁾ = (xᵇ)ᵃ
 type instance (a,bs) :=>-> x = a -> bs :=>-> x
 }}}

 I don't think `:=>->` type family is injective: both `() :=>-> (Int ->
 Int)` and `(Int,()) :=>-> Int` reduce to `Int -> Int`.

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


More information about the ghc-tickets mailing list