Typeable: Generalize kind of represented type
authorBen Gamari <bgamari.foss@gmail.com>
Tue, 19 Sep 2017 22:59:18 +0000 (18:59 -0400)
committerBen Gamari <ben@smart-cactus.org>
Thu, 21 Sep 2017 15:30:38 +0000 (11:30 -0400)
This allows withTypeable to be used with things that are of kind other
than Type.

Test Plan: Validate

Reviewers: austin, hvr, dfeuer

Reviewed By: dfeuer

Subscribers: rwbarton, thomie, dfeuer

Differential Revision: https://phabricator.haskell.org/D3996

libraries/base/Data/Typeable/Internal.hs

index bc36fb1..f97a804 100644 (file)
@@ -323,13 +323,14 @@ splitApp rep@(TrFun _ a b) = Just (IsApp (mkTrApp arr a) b)
 splitApp (TrTyCon{})       = Nothing
 
 -- | Use a 'TypeRep' as 'Typeable' evidence.
-withTypeable :: forall a r. TypeRep a -> (Typeable a => r) -> r
+withTypeable :: forall (a :: k) (r :: TYPE rep). ()
+             => TypeRep a -> (Typeable a => r) -> r
 withTypeable rep k = unsafeCoerce k' rep
   where k' :: Gift a r
         k' = Gift k
 
 -- | A helper to satisfy the type checker in 'withTypeable'.
-newtype Gift a r = Gift (Typeable a => r)
+newtype Gift a (r :: TYPE rep) = Gift (Typeable a => r)
 
 -- | Pattern match on a type constructor
 pattern Con :: forall k (a :: k). TyCon -> TypeRep a