[GHC] #9291: Don't reconstruct sum types if the type subtly changes

GHC ghc-devs at haskell.org
Thu Jul 10 16:21:40 UTC 2014


#9291: Don't reconstruct sum types if the type subtly changes
----------------------------+----------------------------------------------
        Reporter:  schyler  |            Owner:
            Type:  feature  |           Status:  new
  request                   |        Milestone:
        Priority:  normal   |          Version:  7.8.2
       Component:           |         Keywords:
  Compiler                  |     Architecture:  Unknown/Multiple
      Resolution:           |       Difficulty:  Moderate (less than a day)
Operating System:           |       Blocked By:
  Unknown/Multiple          |  Related Tickets:
 Type of failure:           |
  None/Unknown              |
       Test Case:           |
        Blocking:           |
----------------------------+----------------------------------------------

Comment (by rwbarton):

 I think the lens package uses this pattern extensively, or at least
 something closely related.

 In discussion with "napping" on IRC the idea arose to extend Core-level
 `case` with the power to generalize the type of its scrutinee. For
 example, if `x :: Either Int String`, then (using a syntax inspired by as-
 patterns, and omitting some noisy details)
 {{{
 case x of _ {
   xLeft@(Left int) -> {- here xLeft :: Either Int b (we don't use it) -}
     Left @ String @ String (show @ Int int)
   xRight@(Right str) -> {- here xRight :: Either a String -}
     xRight @ String
 }
 }}}

 The appropriate amount of type generalization would depend on the type
 variables that appear in the fields of the constructor that was matched,
 after translating GADT constructors into type equality constraints. For
 example given the type `data X a b where MkX :: b -> X Int b`, if we match
 `x :: X Int Char` with `MkX Char`, we cannot generalize the type of `x` to
 `X a Char`, since the translated type of `MkX` is `MkX :: (a ~ Int) => b
 -> X a b` which does mention `a` on the left-hand side (in a constraint).
 This is all rather similar to role inference for data types, I imagine,
 except done on a per-constructor basis.

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


More information about the ghc-tickets mailing list