X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FbasicTypes%2FBasicTypes.lhs;h=d73e4f1818d27645bf5e5cdced4d0554949b1cc7;hb=9da4639011348fb6c318e3cba4b08622f811d9c4;hp=6b662bd6a64c18c590d9dc541187fe88e13d1c79;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/compiler/basicTypes/BasicTypes.lhs b/compiler/basicTypes/BasicTypes.lhs index 6b662bd..d73e4f1 100644 --- a/compiler/basicTypes/BasicTypes.lhs +++ b/compiler/basicTypes/BasicTypes.lhs @@ -31,6 +31,8 @@ module BasicTypes( TopLevelFlag(..), isTopLevel, isNotTopLevel, + OverlapFlag(..), + Boxity(..), isBoxed, TupCon(..), tupleParens, @@ -107,24 +109,18 @@ The @IPName@ type is here because it is used in TypeRep (i.e. very early in the hierarchy), but also in HsSyn. \begin{code} -data IPName name - = Dupable name -- ?x: you can freely duplicate this implicit parameter - | Linear name -- %x: you must use the splitting function to duplicate it +newtype IPName name = IPName name -- ?x deriving( Eq, Ord ) -- Ord is used in the IP name cache finite map -- (used in HscTypes.OrigIParamCache) - ipNameName :: IPName name -> name -ipNameName (Dupable n) = n -ipNameName (Linear n) = n +ipNameName (IPName n) = n mapIPName :: (a->b) -> IPName a -> IPName b -mapIPName f (Dupable n) = Dupable (f n) -mapIPName f (Linear n) = Linear (f n) +mapIPName f (IPName n) = IPName (f n) instance Outputable name => Outputable (IPName name) where - ppr (Dupable n) = char '?' <> ppr n -- Ordinary implicit parameters - ppr (Linear n) = char '%' <> ppr n -- Splittable implicit parameters + ppr (IPName n) = char '?' <> ppr n -- Ordinary implicit parameters \end{code} @@ -217,7 +213,7 @@ instance Outputable TopLevelFlag where %************************************************************************ %* * -\subsection[Top-level/local]{Top-level/not-top level flag} + Top-level/not-top level flag %* * %************************************************************************ @@ -235,7 +231,7 @@ isBoxed Unboxed = False %************************************************************************ %* * -\subsection[Recursive/Non-Recursive]{Recursive/Non-Recursive flag} + Recursive/Non-Recursive flag %* * %************************************************************************ @@ -263,6 +259,47 @@ instance Outputable RecFlag where %************************************************************************ %* * + Instance overlap flag +%* * +%************************************************************************ + +\begin{code} +data OverlapFlag + = NoOverlap -- This instance must not overlap another + + | OverlapOk -- Silently ignore this instance if you find a + -- more specific one that matches the constraint + -- you are trying to resolve + -- + -- Example: constraint (Foo [Int]) + -- instances (Foo [Int]) + -- (Foo [a]) OverlapOk + -- Since the second instance has the OverlapOk flag, + -- the first instance will be chosen (otherwise + -- its ambiguous which to choose) + + | Incoherent -- Like OverlapOk, but also ignore this instance + -- if it doesn't match the constraint you are + -- trying to resolve, but could match if the type variables + -- in the constraint were instantiated + -- + -- Example: constraint (Foo [b]) + -- instances (Foo [Int]) Incoherent + -- (Foo [a]) + -- Without the Incoherent flag, we'd complain that + -- instantiating 'b' would change which instance + -- was chosen + deriving( Eq ) + +instance Outputable OverlapFlag where + ppr NoOverlap = empty + ppr OverlapOk = ptext SLIT("[overlap ok]") + ppr Incoherent = ptext SLIT("[incoherent]") + +\end{code} + +%************************************************************************ +%* * Tuples %* * %************************************************************************