Note [Function types]

GHC/Core/TyCo/Rep.hs:229 compiler 1 ticket

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

Referenced by 1