[GHC] #11011: Add type-indexed type representations (`TypeRep a`)

GHC ghc-devs at haskell.org
Sun Jan 31 12:54:04 UTC 2016


#11011: Add type-indexed type representations (`TypeRep a`)
-------------------------------------+-------------------------------------
        Reporter:  bjmprice          |                Owner:
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:
      Resolution:                    |             Keywords:
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 bgamari):

 Another question that I stumbled upon is whether we should provide
 something akin to `Data.Typeable.splitPolyTyConApp`, which provides access
 to the kind arguments which a type constructor was applied to. In some
 cases there may be no way to extract these kinds otherwise.

 Consider the following,
 {{{#!hs
 data Proxy (a :: k) = Proxy
 proxyIntRep :: TypeRep (Proxy Int)
 proxyIntRep = typeRepKind proxyIntRep

 data Compose (f :: k1 -> *) (g :: k2 -> k1) (x :: k2) = Compose (f (g a))
 data Id a = Id a

 composeIdIdRep :: TypeRep (Compose Id Id)
 composeIdIdRep = typeRep

 -- The plan currently allows
 data AppResult (t :: k) where
     App :: TypeRep a → TypeRep b → AppResult (a b)
 splitApp :: TypeRep a → Maybe (AppResult a)
 typeRepKind :: TypeRep (a :: k) -> TypeRep k

 -- Allowing one to get concrete kind of Proxy
 proxyIntKind :: TypeRep (* -> *)
 proxyIntKind = typeRepKind proxyIntRep

 -- In the case of `Proxy Int` we can extract the first kind argument,
 -- `k ~ *`, trivially via function decomposition as it is the
 -- kind of the first type.
 pattern TRFun :: fun ~ (arg -> res)
               => TTypeRep arg
               -> TTypeRep res
               -> TTypeRep fun

 -- In contrast, determining the instantiation of `k1` in the case of
 -- `Compose Id Id` is not possible since it is not exposed in
 -- the resulting kind.
 composeIdIdKind :: TypeRep (* -> *)
 composeIdIdKind = kindRep composeIdIdRep
 }}}

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


More information about the ghc-tickets mailing list