import Control.Monad
-- Imports for the instances
-import Data.Typeable
import Data.Int -- So we can give Data instance for Int8, ...
import Data.Word -- So we can give Data instance for Word8, ...
#ifdef __GLASGOW_HASKELL__
deriving Show
-
--- | Representation of constructors
+-- | Representation of constructors. Note that equality on constructors
+-- with different types may not work -- i.e. the constructors for 'False' and
+-- 'Nothing' may compare equal.
data Constr = Constr
{ conrep :: ConstrRep
, constring :: String
-- | Public representation of datatypes
-{-# DEPRECATED StringRep "Use CharRep instead" #-}
data DataRep = AlgRep [Constr]
| IntRep
| FloatRep
- | StringRep -- ^ Deprecated. Please use 'CharRep' instead.
| CharRep
| NoRep
-- | Public representation of constructors
-{-# DEPRECATED StringConstr "Use CharConstr instead" #-}
data ConstrRep = AlgConstr ConIndex
| IntConstr Integer
| FloatConstr Rational
- | StringConstr String -- ^ Deprecated. Please use 'CharConstr' instead.
| CharConstr Char
deriving (Eq,Show)
(AlgRep cs, AlgConstr i) -> cs !! (i-1)
(IntRep, IntConstr i) -> mkIntConstr dt i
(FloatRep, FloatConstr f) -> mkRealConstr dt f
- (StringRep, StringConstr str) -> mkStringConstr dt str
(CharRep, CharConstr c) -> mkCharConstr dt c
_ -> error "repConstr"
case dataTypeRep dt of
AlgRep cons -> idx cons
IntRep -> mkReadCon (\i -> (mkPrimCon dt str (IntConstr i)))
- FloatRep -> mkReadCon (\f -> (mkPrimCon dt str (FloatConstr f)))
- StringRep -> Just (mkStringConstr dt str)
+ FloatRep -> mkReadCon ffloat
CharRep -> mkReadCon (\c -> (mkPrimCon dt str (CharConstr c)))
NoRep -> Nothing
where
then Nothing
else Just (head fit)
+ ffloat :: Double -> Constr
+ ffloat = mkPrimCon dt str . FloatConstr . toRational
------------------------------------------------------------------------------
--
-- | This function is now deprecated. Please use 'mkCharType' instead.
{-# DEPRECATED mkStringType "Use mkCharType instead" #-}
mkStringType :: String -> DataType
-mkStringType = mkPrimType StringRep
+mkStringType = mkCharType
-- | Constructs the 'Char' type
mkCharType :: String -> DataType
-- | This function is now deprecated. Please use 'mkCharConstr' instead.
{-# DEPRECATED mkStringConstr "Use mkCharConstr instead" #-}
mkStringConstr :: DataType -> String -> Constr
-mkStringConstr dt str = case datarep dt of
- StringRep -> mkPrimCon dt str (StringConstr str)
- _ -> error "mkStringConstr"
+mkStringConstr dt str =
+ case datarep dt of
+ CharRep -> case str of
+ [c] -> mkPrimCon dt (show c) (CharConstr c)
+ _ -> error "mkStringConstr: input String must contain a single character"
+ _ -> error "mkStringConstr"
-- | Makes a constructor for 'Char'.
mkCharConstr :: DataType -> Char -> Constr