[GHC] #14059: COMPLETE sets don't work at all with data family instances

GHC ghc-devs at haskell.org
Tue Aug 1 03:51:20 UTC 2017


#14059: COMPLETE sets don't work at all with data family instances
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.1
      Resolution:                    |             Keywords:
                                     |  PatternSynonyms,
                                     |  PatternMatchWarnings
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by RyanGlScott):

 I looked into this some more tonight. While I wasn't able to find the
 underlying cause of why `COMPLETE` sets don't seem to quite work for data
 family instances, I did notice a discrepancy between pattern synonyms for
 datatype contructors and those for data family instance constructors. In
 several places throughout GHC, the `conLikeResTy` function is used to
 determine the return type of a conlike (be it a proper data constructor or
 a pattern synonym).

 For datatype constructors, `conLikeResTy` returns something of the form `T
 a1 ... an`, where `T` is a datatype tycon. This holds true regardless of
 whether `conLikeResTy` is called on a proper data constructor (e.g., the
 `MkT` in `data T a = MkT a`) or a pattern synonym for a data constructor
 (e.g., `pattern FakeT a = MkT a`).

 With data family instances, however, the story is a little different.
 Let's suppose we have:

 {{{#!hs
 data family F a b
 data instance F Int b = MkF Int
 pattern FakeF a = MkF a
 }}}

 If you call `conLikeResTy` on `MkF`, you won't get `F Int b`, but instead
 something like `R:FInt b`, where `R:FInt` is the //representation// tycon
 for the data family instance `F Int b` (as opposed to `F`, which is the
 //parent// data family tycon). However, calling `conLikeResTy` on `FakeF`
 gives you `F Int b` instead!

 That's a difference that smells quite funny to me, but I haven't tracked
 down the scent's origin yet. For what it's worth, `COMPLETE` sets group
 conlikes by parent tycon name, not by representation tycon name, so for
 instance:

 {{{#!hs
 {-# COMPLETE SFalse, STooGoodToBeTrue :: Sing #-}
 }}}

 In order to look up these conlikes, you'd need to use `Sing (z :: Bool)`,
 not `R:SingzBool` (type weirdness in comment:1 aside). What does it all
 mean? I can't be sure at the moment.

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


More information about the ghc-tickets mailing list