HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Moduleghc-9.10.3GHC2021

GHC.Core.FamInstEnv

  • 6 types
  • 39 values
  • Packageghc-9.10.3
  • Exports45
  • LanguageGHC2021
  • LicenceBSD-3-Clause
  • SourceFamInstEnv.hs

CoAxioms

21 declarations
valueapartnessCheck
  1. :: [Type]

    flattened target arguments. Make sure they're flattened! See Note [Flattening type-family applications when matching instances] in GHC.Core.Unify.

  2. -> CoAxBranch

    the candidate equation we wish to use Precondition: this matches the target

  3. -> Bool

    True = equation can fire

#

Do an apartness check, as described in the "Closed Type Families" paper (POPL '14). This should be used when determining if an equation (CoAxBranch) of a closed type family can be used to reduce a certain target type family application.

Result of testing two type family equations for injectiviy.

Constructors

  • InjectivityAccepted

    Either RHSs are distinct or unification of RHSs leads to unification of LHSs

  • InjectivityUnified CoAxBranch CoAxBranch

    RHSs unify but LHSs don't unify under that substitution. Relevant for closed type families where equation after unification might be overlapped (in which case it is OK if they don't unify). Constructor stores axioms after unification.

Get rid of *outermost* (or toplevel) * type function redex * data family redex * newtypes returning an appropriate Representational coercion. Specifically, if topNormaliseType_maybe env ty = Just (co, ty') then (a) co :: ty ~R ty' (b) ty' is not a newtype, and is not a type-family or data-family redex

However, ty' can be something like (Maybe (F ty)), where (F ty) is a redex.

Always operates homogeneously: the returned type has the same kind as the original type, and the returned coercion is always homogeneous.

Try to simplify a type-family application, by *one* step If topReduceTyFamApp_maybe env r F tys = Just (HetReduction (Reduction co rhs) res_co) then co :: F tys ~R# rhs res_co :: typeKind(F tys) ~ typeKind(rhs) Type families and data families; always Representational role