Note [Function types]
FunTy is the constructor for a function type. Here are the details:
* The primitive function type constructor FUN has kind
FUN :: forall (m :: Multiplicity) ->
forall {r1 :: RuntimeRep} {r2 :: RuntimeRep}.
TYPE r1 ->
TYPE r2 ->
Type
mkTyConApp ensures that we convert a saturated application
TyConApp FUN [m,r1,r2,t1,t2] into FunTy FTF_T_T m t1 t2
dropping the 'r1' and 'r2' arguments; they are easily recovered
from 't1' and 't2'. The FunTyFlag is always FTF_T_T, because
we build constraint arrows (=>) with e.g. mkPhiTy and friends,
never `mkTyConApp funTyCon args`.
* For the time being its RuntimeRep quantifiers are left
inferred. This is to allow for it to evolve.
* Because the RuntimeRep args came first historically (that is,
the arrow type constructor gained these arguments before gaining
the Multiplicity argument), we wanted to be able to say
type (->) = FUN Many
which we do in library module GHC.Types. This means that the
Multiplicity argument must precede the RuntimeRep arguments --
and it means changing the name of the primitive constructor from
(->) to FUN.
* The multiplicity argument is dependent, because Typeable does not
support a type such as `Multiplicity -> forall {r1 r2 :: RuntimeRep}. ...`.
There is a plan to change the argument order and make the
multiplicity argument nondependent in #20164.
* Re the ft_af field: see Note [FunTyFlag] in GHC.Types.Var
See Note [Types for coercions, predicates, and evidence] in
GHC.Core.Predicate. This visibility info makes no difference in Core;
it matter only when we regard the type as a Haskell source type. References 2
- Types for coercions, predicates, and evidence GHC.Core.Predicate
- FunTyFlag GHC.Types.Var
Referenced by 1
- GHC.Core.TyCo.Rep call site