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

  • Packageghc-9.10.3
  • Exports54
  • LanguageGHC2021
  • LicenceBSD-3-Clause
  • SourceFVs.hs

Returns free variables of types, including kind variables as a deterministic set. For type synonyms it does not expand the synonym.

valuetyCoFVsOfType :: Type -> FV
#

The worker for tyCoFVsOfType and tyCoFVsOfTypeList. The previous implementation used unionVarSet which is O(n+m) and can make the function quadratic. It's exported, so that it can be composed with other functions that compute free variables. See Note [FV naming conventions] in GHC.Utils.FV.

Eta-expanded because that makes it run faster (apparently) See Note [FV eta expansion] in GHC.Utils.FV for explanation.

valuetyCoVarsOfTypesList :: [Type] -> [TyCoVar]
#

Returns free variables of types, including kind variables as a deterministically ordered list. For type synonyms it does not expand the synonym.

valueinjectiveVarsOfType
  1. :: Bool

    Should we look under injective type families? See Note [Coverage condition for injective type families] in GHC.Tc.Instance.Family.

  2. -> Type
  3. -> FV
#

Returns the free variables of a Type that are in injective positions. Specifically, it finds the free variables while:

  • Expanding type synonyms

  • Ignoring the coercion in (ty |> co)

  • Ignoring the non-injective fields of a TyConApp

For example, if F is a non-injective type family, then:

injectiveTyVarsOf( Either c (Maybe (a, F b c)) ) = {a,c}

If injectiveVarsOfType ty = itvs, then knowing ty fixes itvs. More formally, if a is in injectiveVarsOfType ty and S1(ty) ~ S2(ty), then S1(a) ~ S2(a), where S1 and S2 are arbitrary substitutions.

See Note [When does a tycon application need an explicit kind signature?].

valueinjectiveVarsOfTypes
  1. :: Bool

    look under injective type families? See Note [Coverage condition for injective type families] in GHC.Tc.Instance.Family.

  2. -> [Type]
  3. -> FV
#

Returns the free variables of a Type that are in injective positions. Specifically, it finds the free variables while:

  • Expanding type synonyms

  • Ignoring the coercion in (ty |> co)

  • Ignoring the non-injective fields of a TyConApp

See Note [When does a tycon application need an explicit kind signature?].

valueinvisibleVarsOfType :: Type -> FV
#

Returns the set of variables that are used invisibly anywhere within the given type. A variable will be included even if it is used both visibly and invisibly. An invisible use site includes: * In the kind of a variable * In the kind of a bound variable in a forall * In a coercion * In a Specified or Inferred argument to a function See Note [VarBndrs, ForAllTyBinders, TyConBinders, and visibility] in GHC.Core.TyCo.Rep

Free type constructors

2 declarations

All type constructors occurring in the type; looking through type synonyms, but not newtypes. When it finds a Class, it returns the class TyCon.

Free vars with visible/invisible separate

2 declarations

Retrieve the free variables in this type, splitting them based on whether they are used visibly or invisibly. Invisible ones come first.

Occurrence-check expansion

1 declaration

Well-scoped free variables

3 declarations
valuescopedSort :: [TyCoVar] -> [TyCoVar]
#

Do a topological sort on a list of tyvars, so that binders occur before occurrences E.g. given [ a::k, k::*, b::k ] it'll return a well-scoped list [ k::*, a::k, b::k ]

This is a deterministic sorting operation (that is, doesn't depend on Uniques).

It is also meant to be stable: that is, variables should not be reordered unnecessarily. This is specified in Note [ScopedSort] See also Note [Ordering of implicit variables] in GHC.Rename.HsType

Closing over kinds

3 declarations
valuecloseOverKindsList :: [TyVar] -> [TyVar]
#

Add the kind variables free in the kinds of the tyvars in the given set. Returns a deterministically ordered list.

Raw materials

2 declarations
newtypenewtype Endo a
#

The monoid of endomorphisms under composition.

Endo f <> Endo g == Endo (f . g)
Examples
Example2 expressions
let computation = Endo ("Hello, " ++) <> Endo (++ "!")appEndo computation "Haskell""Hello, Haskell!"
Example2 expressions
let computation = Endo (*3) <> Endo (+1)appEndo computation 16

Constructors

Instances4Generic, Semigroup, Monoid, Rep