[project @ 2004-03-20 12:42:27 by ross]
authorross <unknown>
Sat, 20 Mar 2004 12:42:28 +0000 (12:42 +0000)
committerross <unknown>
Sat, 20 Mar 2004 12:42:28 +0000 (12:42 +0000)
Comments (and deleted some of the blank lines Ralf is so fond of).

Data/Typeable.hs
include/Typeable.h

index 1151d08..4eef681 100644 (file)
@@ -47,6 +47,7 @@ module Data.Typeable
        tyconString,    -- :: TyCon   -> String
 
        -- * The other Typeable classes
+       -- | The general instances are provided for GHC only.
        Typeable1( typeOf1 ),   -- :: t a -> TypeRep
        Typeable2( typeOf2 ),   -- :: t a b -> TypeRep
        Typeable3( typeOf3 ),   -- :: t a b c -> TypeRep
@@ -58,6 +59,8 @@ module Data.Typeable
        gcast2,                 -- :: ... => c (t a b) -> Maybe (c (t' a b))
 
        -- * Default instances
+       -- | These are not needed by GHC, for which these instances are
+       -- generated by general instance declarations.
        typeOfDefault,  -- :: (Typeable1 t, Typeable a) => t a -> TypeRep
        typeOf1Default, -- :: (Typeable2 t, Typeable a) => t a b -> TypeRep
        typeOf2Default, -- :: (Typeable2 t, Typeable a) => t a b c -> TypeRep
@@ -68,7 +71,6 @@ module Data.Typeable
 
   ) where
 
-
 import qualified Data.HashTable as HT
 import Data.Maybe
 import Data.Either
@@ -107,7 +109,6 @@ import NHC.IOExtras (IORef,newIORef,readIORef,writeIORef,unsafePerformIO)
 #include "Typeable.h"
 #endif
 
-
 #ifndef __HUGS__
 
 -------------------------------------------------------------
@@ -116,7 +117,6 @@ import NHC.IOExtras (IORef,newIORef,readIORef,writeIORef,unsafePerformIO)
 --
 -------------------------------------------------------------
 
-
 -- | A concrete representation of a (monomorphic) type.  'TypeRep'
 -- supports reasonably efficient equality.
 data TypeRep = TypeRep !Key TyCon [TypeRep] 
@@ -145,7 +145,6 @@ instance Eq TyCon where
        -- sequence of commas, e.g., (mkTyCon ",,,,") returns
        -- the 5-tuple tycon.
 
-
 ----------------- Construction --------------------
 
 -- | Applies a type constructor to a sequence of types
@@ -155,13 +154,11 @@ mkAppTy tc@(TyCon tc_k _) args
   where
     arg_ks = [k | TypeRep k _ _ <- args]
 
-
 -- | A special case of 'mkAppTy', which applies the function 
 -- type constructor to a pair of types.
 mkFunTy  :: TypeRep -> TypeRep -> TypeRep
 mkFunTy f a = mkAppTy funTc [f,a]
 
-
 -- | Applies a type to a function type.  Returns: @'Just' u@ if the
 -- first argument represents a function of type @t -> u@ and the
 -- second argument represents a function of type @t@.  Otherwise,
@@ -171,14 +168,12 @@ applyTy (TypeRep _ tc [t1,t2]) t3
   | tc == funTc && t1 == t3    = Just t2
 applyTy _ _                    = Nothing
 
-
 -- | Adds a TypeRep argument to a TypeRep.
 popStarTy :: TypeRep -> TypeRep -> TypeRep
 popStarTy (TypeRep tr_k tc trs) arg_tr
   = let (TypeRep arg_k _ _) = arg_tr
      in  TypeRep (appKey tr_k arg_k) tc (trs++[arg_tr])
 
-
 -- If we enforce the restriction that there is only one
 -- @TyCon@ for a type & it is shared among all its uses,
 -- we can map them onto Ints very simply. The benefit is,
@@ -203,26 +198,20 @@ mkTyCon :: String -- ^ the name of the type constructor (should be unique
        -> TyCon        -- ^ A unique 'TyCon' object
 mkTyCon str = TyCon (mkTyConKey str) str
 
-
-
 ----------------- Observation ---------------------
 
-
 -- | Observe the type constructor of a type representation
 typerepTyCon :: TypeRep -> TyCon
 typerepTyCon (TypeRep _ tc _) = tc
 
-
 -- | Observe the argument types of a type representation
 typerepArgs :: TypeRep -> [TypeRep]
 typerepArgs (TypeRep _ _ args) = args
 
-
 -- | Observe string encoding of a type representation
 tyconString :: TyCon   -> String
 tyconString  (TyCon _ str) = str
 
-
 ----------------- Showing TypeReps --------------------
 
 instance Show TypeRep where
@@ -248,7 +237,6 @@ isTupleTyCon :: TyCon -> Bool
 isTupleTyCon (TyCon _ (',':_)) = True
 isTupleTyCon _                = False
 
-
 -- Some (Show.TypeRep) helpers:
 
 showArgs :: Show a => [a] -> ShowS
@@ -264,14 +252,12 @@ showTuple (TyCon _ str) args = showChar '(' . go str args
   go (',':xs) (a:as) = showsPrec 10 a . showChar ',' . go xs as
   go _ _   = showChar ')'
 
-
 -------------------------------------------------------------
 --
 --     The Typeable class and friends
 --
 -------------------------------------------------------------
 
-
 -- | The class 'Typeable' allows a concrete representation of a type to
 -- be calculated.
 class Typeable a where
@@ -292,14 +278,6 @@ typeOfDefault x = typeOf1 x `popStarTy` typeOf (argType x)
    argType :: t a -> a
    argType =  undefined
 
-#ifdef __GLASGOW_HASKELL__
--- | One Typeable instance for all Typeable1 instances
-instance (Typeable1 s, Typeable a)
-       => Typeable (s a) where
-  typeOf = typeOfDefault
-#endif
-
-
 -- | Variant for binary type constructors
 class Typeable2 t where
   typeOf2 :: t a b -> TypeRep
@@ -311,15 +289,6 @@ typeOf1Default x = typeOf2 x `popStarTy` typeOf (argType x)
    argType :: t a b -> a
    argType =  undefined
 
-
-#ifdef __GLASGOW_HASKELL__
--- | One Typeable1 instance for all Typeable2 instances
-instance (Typeable2 s, Typeable a)
-       => Typeable1 (s a) where
-  typeOf1 = typeOf1Default
-#endif
-
-
 -- | Variant for 3-ary type constructors
 class Typeable3 t where
   typeOf3 :: t a b c -> TypeRep
@@ -331,15 +300,6 @@ typeOf2Default x = typeOf3 x `popStarTy` typeOf (argType x)
    argType :: t a b c -> a
    argType =  undefined
 
-
-#ifdef __GLASGOW_HASKELL__
--- | One Typeable2 instance for all Typeable3 instances
-instance (Typeable3 s, Typeable a)
-       => Typeable2 (s a) where
-  typeOf2 = typeOf2Default
-#endif
-
-
 -- | Variant for 4-ary type constructors
 class Typeable4 t where
   typeOf4 :: t a b c d -> TypeRep
@@ -351,15 +311,6 @@ typeOf3Default x = typeOf4 x `popStarTy` typeOf (argType x)
    argType :: t a b c d -> a
    argType =  undefined
 
-
-#ifdef __GLASGOW_HASKELL__
--- | One Typeable3 instance for all Typeable4 instances
-instance (Typeable4 s, Typeable a)
-       => Typeable3 (s a) where
-  typeOf3 = typeOf3Default
-#endif
-
-
 -- | Variant for 5-ary type constructors
 class Typeable5 t where
   typeOf5 :: t a b c d e -> TypeRep
@@ -371,15 +322,6 @@ typeOf4Default x = typeOf5 x `popStarTy` typeOf (argType x)
    argType :: t a b c d e -> a
    argType =  undefined
 
-
-#ifdef __GLASGOW_HASKELL__
--- | One Typeable4 instance for all Typeable5 instances
-instance (Typeable5 s, Typeable a)
-       => Typeable4 (s a) where
-  typeOf4 = typeOf4Default
-#endif
-
-
 -- | Variant for 6-ary type constructors
 class Typeable6 t where
   typeOf6 :: t a b c d e f -> TypeRep
@@ -391,15 +333,6 @@ typeOf5Default x = typeOf6 x `popStarTy` typeOf (argType x)
    argType :: t a b c d e f -> a
    argType =  undefined
 
-
-#ifdef __GLASGOW_HASKELL__
--- | One Typeable5 instance for all Typeable6 instances
-instance (Typeable6 s, Typeable a)
-       => Typeable5 (s a) where
-  typeOf5 = typeOf5Default
-#endif
-
-
 -- | Variant for 7-ary type constructors
 class Typeable7 t where
   typeOf7 :: t a b c d e f g -> TypeRep
@@ -411,15 +344,49 @@ typeOf6Default x = typeOf7 x `popStarTy` typeOf (argType x)
    argType :: t a b c d e f g -> a
    argType =  undefined
 
-
 #ifdef __GLASGOW_HASKELL__
+-- Given a @Typeable@/n/ instance for an /n/-ary type constructor,
+-- define the instances for partial applications.
+-- Programmers using non-GHC implementations must do this manually
+-- for each type constructor.
+-- (The INSTANCE_TYPEABLE/n/ macros in Typeable.h include this.)
+
+-- | One Typeable instance for all Typeable1 instances
+instance (Typeable1 s, Typeable a)
+       => Typeable (s a) where
+  typeOf = typeOfDefault
+
+-- | One Typeable1 instance for all Typeable2 instances
+instance (Typeable2 s, Typeable a)
+       => Typeable1 (s a) where
+  typeOf1 = typeOf1Default
+
+-- | One Typeable2 instance for all Typeable3 instances
+instance (Typeable3 s, Typeable a)
+       => Typeable2 (s a) where
+  typeOf2 = typeOf2Default
+
+-- | One Typeable3 instance for all Typeable4 instances
+instance (Typeable4 s, Typeable a)
+       => Typeable3 (s a) where
+  typeOf3 = typeOf3Default
+
+-- | One Typeable4 instance for all Typeable5 instances
+instance (Typeable5 s, Typeable a)
+       => Typeable4 (s a) where
+  typeOf4 = typeOf4Default
+
+-- | One Typeable5 instance for all Typeable6 instances
+instance (Typeable6 s, Typeable a)
+       => Typeable5 (s a) where
+  typeOf5 = typeOf5Default
+
 -- | One Typeable6 instance for all Typeable7 instances
 instance (Typeable7 s, Typeable a)
        => Typeable6 (s a) where
   typeOf6 = typeOf6Default
-#endif
-
 
+#endif /* __GLASGOW_HASKELL__ */
 
 -------------------------------------------------------------
 --
@@ -435,7 +402,6 @@ cast x = r
                then Just $ unsafeCoerce x
               else Nothing
 
-
 -- | A flexible variation parameterised in a type constructor
 gcast :: (Typeable a, Typeable b) => c a -> Maybe (c b)
 gcast x = r
@@ -446,8 +412,6 @@ gcast x = r
   getArg :: c x -> x 
   getArg = undefined
 
-
-
 -- | Cast for * -> *
 gcast1 :: (Typeable1 t, Typeable1 t') => c (t a) -> Maybe (c (t' a)) 
 gcast1 x = r
@@ -458,7 +422,6 @@ gcast1 x = r
   getArg :: c x -> x 
   getArg = undefined
 
-
 -- | Cast for * -> * -> *
 gcast2 :: (Typeable2 t, Typeable2 t') => c (t a b) -> Maybe (c (t' a b)) 
 gcast2 x = r
@@ -469,8 +432,6 @@ gcast2 x = r
   getArg :: c x -> x 
   getArg = undefined
 
-
-
 -------------------------------------------------------------
 --
 --     Instances of the Typeable classes for Prelude types
@@ -493,21 +454,18 @@ tup4Tc = mkTyCon ",,,"
 instance Typeable4 (,,,) where
   typeOf4 tu = mkAppTy tup4Tc []
 
-
 tup5Tc :: TyCon
 tup5Tc = mkTyCon ",,,,"
 
 instance Typeable5 (,,,,) where
   typeOf5 tu = mkAppTy tup5Tc []
 
-
 tup6Tc :: TyCon
 tup6Tc = mkTyCon ",,,,,"
 
 instance Typeable6 (,,,,,) where
   typeOf6 tu = mkAppTy tup6Tc []
 
-
 tup7Tc :: TyCon
 tup7Tc = mkTyCon ",,,,,"
 
index 364641f..9e3bd86 100644 (file)
@@ -1,5 +1,13 @@
 /* ----------------------------------------------------------------------------
  * Macros to help make Typeable instances.
+ *
+ * INSTANCE_TYPEABLEn(tc,tcname,"tc") defines
+ *
+ *     instance Typeable/n/ tc
+ *     instance Typeable a => Typeable/n-1/ (tc a)
+ *     instance (Typeable a, Typeable b) => Typeable/n-2/ (tc a b)
+ *     ...
+ *     instance (Typeable a1, ..., Typeable an) => Typeable (tc a1 ... an)
  * -------------------------------------------------------------------------- */
 
 #define INSTANCE_TYPEABLE0(tycon,tcname,str) \
@@ -8,6 +16,9 @@ instance Typeable tycon where { typeOf _ = mkAppTy tcname [] }
 
 #ifdef __GLASGOW_HASKELL__
 
+/* For GHC, the extra instances follow from general instance declarations
+ * defined in Data.Typeable. */
+
 #define INSTANCE_TYPEABLE1(tycon,tcname,str) \
 tcname = mkTyCon str; \
 instance Typeable1 tycon where { typeOf1 _ = mkAppTy tcname [] }