Implement poly-kinded Typeable
authorJose Pedro Magalhaes <jpm@cs.ox.ac.uk>
Thu, 7 Feb 2013 13:59:51 +0000 (13:59 +0000)
committerJose Pedro Magalhaes <jpm@cs.ox.ac.uk>
Tue, 12 Feb 2013 08:44:07 +0000 (08:44 +0000)
This patch makes the Data.Typeable.Typeable class work with arguments of any
kind. In particular, this removes the Typeable1..7 class hierarchy, greatly
simplyfing the whole Typeable story. Also added is the AutoDeriveTypeable
language extension, which will automatically derive Typeable for all types and
classes declared in that module. Since there is now no good reason to give
handwritten instances of the Typeable class, those are ignored (for backwards
compatibility), and a warning is emitted.

The old, kind-* Typeable class is now called OldTypeable, and lives in the
Data.OldTypeable module. It is deprecated, and should be removed in some future
version of GHC.

26 files changed:
testsuite/tests/annotations/should_fail/annfail06.hs
testsuite/tests/deriving/should_compile/T2378.hs
testsuite/tests/deriving/should_compile/T3965.hs
testsuite/tests/deriving/should_compile/T4302.hs
testsuite/tests/deriving/should_compile/all.T
testsuite/tests/deriving/should_compile/drv021.hs
testsuite/tests/deriving/should_compile/drv021.stderr [new file with mode: 0644]
testsuite/tests/deriving/should_compile/drv022.hs [moved from testsuite/tests/deriving/should_fail/drvfail010.hs with 70% similarity]
testsuite/tests/deriving/should_fail/T2604.stderr
testsuite/tests/deriving/should_fail/all.T
testsuite/tests/deriving/should_fail/drvfail010.stderr [deleted file]
testsuite/tests/deriving/should_fail/drvfail010.stderr-hugs [deleted file]
testsuite/tests/deriving/should_fail/drvfail014.hs
testsuite/tests/driver/T4437.hs
testsuite/tests/indexed-types/should_compile/T1769.hs
testsuite/tests/perf/should_run/T3245.hs
testsuite/tests/rename/should_compile/T4003A.hs-boot
testsuite/tests/safeHaskell/ghci/p15.script
testsuite/tests/safeHaskell/ghci/p15.stderr
testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07.stderr
testsuite/tests/safeHaskell/safeInfered/UnsafeInfered07_A.hs
testsuite/tests/safeHaskell/safeLanguage/SafeLang13.hs
testsuite/tests/safeHaskell/safeLanguage/SafeLang14.hs
testsuite/tests/safeHaskell/unsafeLibs/BadImport02.hs
testsuite/tests/safeHaskell/unsafeLibs/BadImport03.hs
testsuite/tests/typecheck/should_compile/T2433.hs

index 51c9220..671f0c7 100644 (file)
@@ -7,7 +7,7 @@ import Data.Data
 import Data.Typeable
 
 instance Typeable InstancesInWrongModule where
-    typeOf _ = undefined
+    typeRep _ = undefined
 
 instance Data InstancesInWrongModule where
     gfoldl = undefined
index e3118cb..4f12313 100644 (file)
@@ -7,4 +7,4 @@ import Data.Data
 
 newtype T f = MkT Int
 
-deriving instance Typeable1 T
+deriving instance Typeable T
index 2ccaaad..99217ac 100644 (file)
@@ -3,16 +3,11 @@ module T3965 where
 
 import Data.Data
 
-data T f e = Inl (f e) deriving (Data, Eq)
+data T f e = Inl (f e) deriving (Data, Typeable, Eq)
 
-instance (Typeable1 f) => Typeable1 (T f) where
-  typeOf1 _ = error "urk"
+newtype Expr f = In (f (Expr f)) deriving Typeable
 
-newtype Expr f = In (f (Expr f))
-instance Typeable1 f => Typeable (Expr f) where
-  typeOf _ = error "urk"
-
-deriving instance (Typeable1 a, Data (a (Expr a))) => Data (Expr a)
+deriving instance (Typeable a, Data (a (Expr a))) => Data (Expr a)
 
 data Var e = Var String deriving (Data, Eq, Typeable)
 
index 5036963..53035cf 100644 (file)
@@ -11,7 +11,7 @@ data Test a
 
 deriving instance Eq (Test a) 
 deriving instance Ord (Test a) 
-deriving instance Typeable1 Test
+deriving instance Typeable Test
 deriving instance Data a => Data (Test a) 
 deriving instance Functor Test 
 deriving instance Foldable Test 
index 6fbe383..5e9af5e 100644 (file)
@@ -15,6 +15,7 @@ test('drv014', normal, compile, [''])
 test('drv015', normal, compile, [''])
 test('drv020', normal, compile, [''])
 test('drv021', normal, compile, [''])
+test('drv022', normal, compile, [''])
 test('deriving-1935', normal, compile, [''])
 test('T2378', normal, compile, [''])
 test('T2856', normal, compile, [''])
index c980050..977372a 100644 (file)
@@ -6,7 +6,7 @@
 
 module ShouldCompile where
 
-import Data.Typeable
+import Data.OldTypeable
 
 data T1 a   = T1 a
 data T2 a b = T2 a b 
diff --git a/testsuite/tests/deriving/should_compile/drv021.stderr b/testsuite/tests/deriving/should_compile/drv021.stderr
new file mode 100644 (file)
index 0000000..8143dfe
--- /dev/null
@@ -0,0 +1,13 @@
+
+drv021.hs:9:1: Warning:
+    Module `Data.OldTypeable' is deprecated: Use Data.Typeable instead
+
+drv021.hs:14:19: Warning:
+    In the use of type constructor or class `Typeable1'
+    (imported from Data.OldTypeable, but defined in Data.OldTypeable.Internal):
+    Deprecated: "Use Data.Typeable.Internal instead"
+
+drv021.hs:15:19: Warning:
+    In the use of type constructor or class `Typeable2'
+    (imported from Data.OldTypeable, but defined in Data.OldTypeable.Internal):
+    Deprecated: "Use Data.Typeable.Internal instead"
@@ -1,10 +1,10 @@
 {-# LANGUAGE DeriveDataTypeable #-}
 
-module ShouldFail where
+module ShouldCompile where
 import Data.Typeable
 
 data A a b c d e f g h i j = A deriving (Typeable)
-       -- Too many args
+  -- Many args
 
 data B a b = B (a b) deriving (Typeable)
-       -- Non type-kind args
\ No newline at end of file
+  -- Non type-kind args
\ No newline at end of file
index 6cda6c3..8fe5fff 100644 (file)
@@ -1,10 +1,10 @@
 \r
 T2604.hs:7:35:\r
-    Can't make a derived instance of `Typeable (DList a)':\r
+    Can't make a derived instance of `Typeable (DList a)':\r
       You need -XDeriveDataTypeable to derive an instance for this class\r
     In the data declaration for `DList'\r
 \r
 T2604.hs:9:38:\r
-    Can't make a derived instance of `Typeable (NList a)':\r
+    Can't make a derived instance of `Typeable (NList a)':\r
       You need -XDeriveDataTypeable to derive an instance for this class\r
     In the newtype declaration for `NList'\r
index 5fface8..e7cb909 100644 (file)
@@ -8,7 +8,6 @@ test('drvfail006', reqlib('mtl'), compile_fail, [''])
 test('drvfail007', normal, compile_fail, [''])
 test('drvfail008', reqlib('mtl'), compile_fail, [''])
 test('drvfail009', normal, compile_fail, [''])
-test('drvfail010', normal, compile_fail, [''])
 test('drvfail011', normal, compile_fail, [''])
 test('drvfail012', normal, compile_fail, [''])
 test('drvfail013', normal, compile_fail, [''])
diff --git a/testsuite/tests/deriving/should_fail/drvfail010.stderr b/testsuite/tests/deriving/should_fail/drvfail010.stderr
deleted file mode 100644 (file)
index cf2baa6..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-\r
-drvfail010.hs:6:42:\r
-    Can't make a derived instance of\r
-      `Typeable (A a b c d e f g h i j)':\r
-      `A' must have 7 or fewer arguments\r
-    In the data declaration for `A'\r
-\r
-drvfail010.hs:9:32:\r
-    Can't make a derived instance of `Typeable (B a b)':\r
-      `B' must only have arguments of kind `*'\r
-    In the data declaration for `B'\r
diff --git a/testsuite/tests/deriving/should_fail/drvfail010.stderr-hugs b/testsuite/tests/deriving/should_fail/drvfail010.stderr-hugs
deleted file mode 100644 (file)
index f647997..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ERROR "drvfail010.hs":6 - Cannot derive instances of class "Typeable"
index 9039332..117b7d5 100644 (file)
@@ -3,7 +3,7 @@
 -- See Trac #1825
 
 module ShouldFail where
-import Data.Typeable
+import Data.OldTypeable
 
 data T1 a = T1 a deriving( Typeable1 )
 
index ca1f149..23be89b 100644 (file)
@@ -37,7 +37,8 @@ expectedGhcOnlyExtensions = [
                              "AlternativeLayoutRuleTransitional",
                              "ExplicitNamespaces",
                              "TypeHoles",
-                             "EmptyCase" ]
+                             "EmptyCase",
+                             "AutoDeriveTypeable"]
 
 expectedCabalOnlyExtensions :: [String]
 expectedCabalOnlyExtensions = ["Generics",
index 57b9660..7a256e1 100644 (file)
@@ -5,7 +5,7 @@ module T1769 where
 import Data.Typeable\r
 \r
 data family T a\r
-deriving instance Typeable1 T\r
+deriving instance Typeable T\r
 -- deriving instance Functor T\r
 \r
 data instance T [b] = T1 | T2 b \r
index f52fc27..d345fed 100644 (file)
@@ -1,4 +1,4 @@
-{-# LANGUAGE ExistentialQuantification #-}
+{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}
 
 -- The second version (count2) took ages with GHC 6.12
 -- because the typeOf function was not properly memoised
@@ -44,7 +44,4 @@ main = do
   doTime $ count1 x
   doTime $ count1 x
 
-data T = MkT
-tcname :: TyCon
-tcname = mkTyCon "T"
-instance Typeable T where { typeOf _ = mkTyConApp tcname [] }
+data T = MkT deriving Typeable
index b750e47..a615301 100644 (file)
@@ -4,5 +4,5 @@ import Data.Data
 
 data HsExpr i
 
-instance Typeable1 HsExpr
+instance Typeable HsExpr
 instance Data i => Data (HsExpr i)
index 3faeec9..81f2033 100644 (file)
@@ -4,7 +4,7 @@
 :set -XDeriveDataTypeable
 :set -XStandaloneDeriving
 
-:m + Data.Typeable
+:m + Data.OldTypeable
 
 data H = H {h :: String} deriving (Typeable, Show)
 
index bc1069c..f50d460 100644 (file)
@@ -1,4 +1,12 @@
 
+Top level: Warning:
+    Module `Data.OldTypeable' is deprecated: Use Data.Typeable instead
+
+<interactive>:10:36: Warning:
+    In the use of type constructor or class `Typeable'
+    (imported from Data.OldTypeable, but defined in Data.OldTypeable.Internal):
+    Deprecated: "Use Data.Typeable.Internal instead"
+
 <interactive>:14:10:
     Can't create hand written instances of Typeable in Safe Haskell! Can only derive them
 
index 98a7e80..4a83680 100644 (file)
@@ -1,4 +1,22 @@
 [1 of 2] Compiling UnsafeInfered07_A ( UnsafeInfered07_A.hs, UnsafeInfered07_A.o )
+
+UnsafeInfered07_A.hs:4:1: Warning:
+    Module `Data.OldTypeable' is deprecated: Use Data.Typeable instead
+
+UnsafeInfered07_A.hs:8:10: Warning:
+    In the use of type constructor or class `Typeable'
+    (imported from Data.OldTypeable, but defined in Data.OldTypeable.Internal):
+    Deprecated: "Use Data.Typeable.Internal instead"
+
+UnsafeInfered07_A.hs:8:10: Warning:
+    In the use of type constructor or class `Typeable'
+    (imported from Data.OldTypeable, but defined in Data.OldTypeable.Internal):
+    Deprecated: "Use Data.Typeable.Internal instead"
+
+UnsafeInfered07_A.hs:9:16: Warning:
+    In the use of `typeOf'
+    (imported from Data.OldTypeable, but defined in Data.OldTypeable.Internal):
+    Deprecated: "Use Data.Typeable.Internal instead"
 [2 of 2] Compiling UnsafeInfered07  ( UnsafeInfered07.hs, UnsafeInfered07.o )
 
 UnsafeInfered07.hs:4:1:
index ffc1159..9bd6b45 100644 (file)
@@ -1,7 +1,7 @@
 -- | Unsafe as hand crafts a typeable instance
 module UnsafeInfered07_A where
 
-import Data.Typeable
+import Data.OldTypeable
 
 data G = G Int
 
index 9be68a3..e11b616 100644 (file)
@@ -5,7 +5,7 @@
 module Main where
 
 import SafeLang13_A
-import Data.Typeable
+import Data.OldTypeable
 
 data H = H String deriving (Typeable, Show)
 
index 59e8386..98e29fb 100644 (file)
@@ -5,7 +5,7 @@
 module Main where
 
 import SafeLang14_A
-import Data.Typeable
+import Data.OldTypeable
 
 data H = H String deriving (Typeable, Show)
 
index e9d5ca7..80eba62 100644 (file)
@@ -3,7 +3,7 @@
 -- | Here we used typeable to produce an illegal value
 module Main where
 
-import Data.Typeable
+import Data.OldTypeable
 
 import BadImport02_A
 
index 9b8a565..9c06d34 100644 (file)
@@ -5,7 +5,7 @@
 -- Now using SAFE though so will fail
 module Main where
 
-import Data.Typeable
+import Data.OldTypeable
 
 import BadImport03_A
 
index 345c961..727ec6b 100644 (file)
@@ -5,7 +5,7 @@
 
 module T2433 where
 
- import Data.Typeable(Typeable1)
+ import Data.Typeable(Typeable)
  import T2433_Help( T )
 
- deriving instance Typeable1 T
+ deriving instance Typeable T