[GHC] #8516: Add (->) representation and the Invariant class to GHC.Generics

GHC ghc-devs at haskell.org
Mon Aug 15 14:11:51 UTC 2016


#8516: Add (->) representation and the Invariant class to GHC.Generics
-------------------------------------+-------------------------------------
        Reporter:  nfrisby           |                Owner:
            Type:  feature request   |               Status:  new
        Priority:  low               |            Milestone:
       Component:  Compiler (Type    |              Version:  7.7
  checker)                           |
      Resolution:                    |             Keywords:  Generics
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):

 Thanks, Simon! `ImplicationConstraints`/`QuantifiedConstraints` is
 something I've been wanting for a while, and it would definitely help me
 express more things in GHC generics than I've been wanting to express (see
 [https://ghc.haskell.org/trac/ghc/ticket/5927#comment:17 this comment] in
 #5927 for more).

 nfrisby, I thought of one more scenario in which conditions (1) and (2)
 could hold, but it's a bit of a silly one:

 {{{#!hs
 type role Wat nominal
 newtype Wat a = Wat a deriving (Functor, Generic1)
 }}}

 A scheming user could use `RoleAnnotations` to explicitly mark a role as
 `nominal` that would otherwise be inferred as `representational` (or
 `phantom`). But this feels extremely silly to me, since having a `Functor`
 instance seems to defeat the whole point of having a `nominal` role, since
 you can just use `fmap` to change the internal representation yourself.
 Indeed, the only examples I can think of where users mark roles as
 `nominal` are:

 1. `Set` (from the
 [http://hackage.haskell.org/package/containers-0.5.7.1/docs/Data-
 Set.html#t:Set containers] package)
 2. `HashSet` (from the [http://hackage.haskell.org/package/unordered-
 containers-0.2.7.1/docs/Data-HashSet.html#t:HashSet unordered-containers]
 package)
 3. `Key` (from the [http://hackage.haskell.org/package/vault-0.3.0.6/docs
 /Data-Vault-ST-Strict.html#t:Key vault] package)

 And none of those can have `Functor` instances anyway. So I don't think
 this "counterexample" is much of a concern at all.

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


More information about the ghc-tickets mailing list