InstEnv

ghc-7.8.2: The GHC API

Safe Haskell | None
Language | Haskell98

InstEnv

Synopsis

- type DFunId = Id
- data OverlapFlag
  - = NoOverlap {
    - isSafeOverlap :: Bool
    }
  - | OverlapOk {
    - isSafeOverlap :: Bool
    }
  - | Incoherent {
    - isSafeOverlap :: Bool
    }
- type InstMatch = (ClsInst, [DFunInstType])
- type ClsInstLookupResult = ([InstMatch], [ClsInst], Bool)
- data ClsInst = ClsInst {
  - is_cls_nm :: Name
  - is_tcs :: [Maybe Name]
  - is_tvs :: [TyVar]
  - is_cls :: Class
  - is_tys :: [Type]
  - is_dfun :: DFunId
  - is_flag :: OverlapFlag
  }
- type DFunInstType = Maybe Type
- pprInstance :: ClsInst -> SDoc
- pprInstanceHdr :: ClsInst -> SDoc
- pprInstances :: [ClsInst] -> SDoc
- instanceHead :: ClsInst -> ([TyVar], Class, [Type])
- instanceSig :: ClsInst -> ([TyVar], [Type], Class, [Type])
- mkLocalInstance :: DFunId -> OverlapFlag -> [TyVar] -> Class -> [Type] -> ClsInst
- mkImportedInstance :: Name -> [Maybe Name] -> DFunId -> OverlapFlag -> ClsInst
- instanceDFunId :: ClsInst -> DFunId
- tidyClsInstDFun :: (DFunId -> DFunId) -> ClsInst -> ClsInst
- instanceRoughTcs :: ClsInst -> [Maybe Name]
- type InstEnv = UniqFM ClsInstEnv
- emptyInstEnv :: InstEnv
- extendInstEnv :: InstEnv -> ClsInst -> InstEnv
- overwriteInstEnv :: InstEnv -> ClsInst -> InstEnv
- extendInstEnvList :: InstEnv -> [ClsInst] -> InstEnv
- lookupUniqueInstEnv :: (InstEnv, InstEnv) -> Class -> [Type] -> Either MsgDoc (ClsInst, [Type])
- lookupInstEnv' :: InstEnv -> Class -> [Type] -> ([InstMatch], [ClsInst])
- lookupInstEnv :: (InstEnv, InstEnv) -> Class -> [Type] -> ClsInstLookupResult
- instEnvElts :: InstEnv -> [ClsInst]
- classInstances :: (InstEnv, InstEnv) -> Class -> [ClsInst]
- orphNamesOfClsInst :: ClsInst -> NameSet
- instanceBindFun :: TyVar -> BindFlag
- instanceCantMatch :: [Maybe Name] -> [Maybe Name] -> Bool
- roughMatchTcs :: [Type] -> [Maybe Name]

# Documentation

type DFunId = Id Source

data OverlapFlag Source

The semantics allowed for overlapping instances for a particular instance. See Note [Safe Haskell isSafeOverlap] (in `lhs`) for a explanation of the `isSafeOverlap` field.

Constructors

NoOverlap | This instance must not overlap another
Fields isSafeOverlap :: Bool
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)
Fields isSafeOverlap :: Bool
Incoherent | Silently ignore this instance if you find any other that matches the constraing you are trying to resolve, including when checking if there are instances that do not match, but unify. 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. See also note [Incoherent instances]
Fields isSafeOverlap :: Bool

Instances

Eq OverlapFlag |
Data OverlapFlag |
Outputable OverlapFlag |
Binary OverlapFlag |
Typeable * OverlapFlag |

type InstMatch = (ClsInst, [DFunInstType]) Source

type ClsInstLookupResult = ([InstMatch], [ClsInst], Bool) Source

data ClsInst Source

Constructors

ClsInst |
Fields is_cls_nm :: Name is_tcs :: [Maybe Name] is_tvs :: [TyVar] is_cls :: Class is_tys :: [Type] is_dfun :: DFunId is_flag :: OverlapFlag

Instances

Data ClsInst |
Outputable ClsInst |
NamedThing ClsInst |
Typeable * ClsInst |

type DFunInstType = Maybe Type Source

pprInstance :: ClsInst -> SDoc Source

pprInstanceHdr :: ClsInst -> SDoc Source

pprInstances :: [ClsInst] -> SDoc Source

instanceHead :: ClsInst -> ([TyVar], Class, [Type]) Source

instanceSig :: ClsInst -> ([TyVar], [Type], Class, [Type]) Source

mkLocalInstance :: DFunId -> OverlapFlag -> [TyVar] -> Class -> [Type] -> ClsInst Source

mkImportedInstance :: Name -> [Maybe Name] -> DFunId -> OverlapFlag -> ClsInst Source

instanceDFunId :: ClsInst -> DFunId Source

tidyClsInstDFun :: (DFunId -> DFunId) -> ClsInst -> ClsInst Source

instanceRoughTcs :: ClsInst -> [Maybe Name] Source

type InstEnv = UniqFM ClsInstEnv Source

emptyInstEnv :: InstEnv Source

extendInstEnv :: InstEnv -> ClsInst -> InstEnv Source

overwriteInstEnv :: InstEnv -> ClsInst -> InstEnv Source

extendInstEnvList :: InstEnv -> [ClsInst] -> InstEnv Source

lookupUniqueInstEnv :: (InstEnv, InstEnv) -> Class -> [Type] -> Either MsgDoc (ClsInst, [Type]) Source

Look up an instance in the given instance environment. The given class application must match exactly one instance and the match may not contain any flexi type variables. If the lookup is unsuccessful, yield 'Left errorMessage'.

lookupInstEnv' :: InstEnv -> Class -> [Type] -> ([InstMatch], [ClsInst]) Source

lookupInstEnv :: (InstEnv, InstEnv) -> Class -> [Type] -> ClsInstLookupResult Source

instEnvElts :: InstEnv -> [ClsInst] Source

classInstances :: (InstEnv, InstEnv) -> Class -> [ClsInst] Source

orphNamesOfClsInst :: ClsInst -> NameSet Source

Collects the names of concrete types and type constructors that make up the head of a class instance. For instance, given `class Foo a b`:

`instance Foo (Either (Maybe Int) a) Bool` would yield [Either, Maybe, Int, Bool]

Used in the implementation of ":info" in GHCi.

instanceBindFun :: TyVar -> BindFlag Source

instanceCantMatch :: [Maybe Name] -> [Maybe Name] -> Bool Source

roughMatchTcs :: [Type] -> [Maybe Name] Source