A type map that tries to reduce (part of) the result type of the type lambda tycon
with the given args
(some of which are wildcard arguments represented by type bounds).
A type map that tries to reduce (part of) the result type of the type lambda tycon
with the given args
(some of which are wildcard arguments represented by type bounds).
Non-wildcard arguments are substituted everywhere as usual. A wildcard argument
>: L <: H
is substituted for a type lambda parameter X
only under certain conditions.
X
appears in a toplevel refinement of the form{ type A = X }
and there are no other occurrences of X
in the reduced type. In that case
the refinement above is replaced by
{ type A >: L <: U }
The allReplaced
field indicates whether all occurrences of type lambda parameters
in the reduced type have been replaced with arguments.
2. If Mode.AllowLambdaWildcardApply is not set: All refinements of the form
{ type A = X }
are replaced by:
{ type A >: L <: U }
Any other occurrence of X
in tycon
is replaced by U
, if the
occurrence of X
in tycon
is covariant, or nonvariant, or by L
,
if the occurrence is contravariant.
The idea is that the AllowLambdaWildcardApply
mode is used to check whether
a type can be soundly reduced, and to give an error or warning if that
is not the case. By contrast, the default mode, with AllowLambdaWildcardApply
not set, reduces all applications even if this yields a different type, so
its postcondition is that no type parameters of tycon
appear in the
result type. Using this mode, we can guarantee that appliedTo
will never
produce a higher-kinded application with a type lambda as type constructor.
Extractor for type application T[U_1, ..., U_n].
Extractor for type application T[U_1, ..., U_n]. This is the refined type
T { type p_1 v_1= U_1; ...; type p_n v_n= U_n }
where v_i, p_i are the variances and names of the type parameters of T.
Adapt all arguments to possible higher-kinded type parameters using etaExpandIfHK
Extractor for
Extractor for
[v1 X1: B1, ..., vn Xn: Bn] -> C[X1, ..., Xn]
where v1, ..., vn and B1, ..., Bn are the variances and bounds of the type parameters of the class C.
If tp
is a TypeBounds instance return its upper bound else return tp
If tp
is a TypeBounds instance return its lower bound else return tp
Assert type is not a TypeBounds instance and return it unchanged
Does the variance of type parameter tparam1
conform to the variance of type parameter tparam2
?
Does variance v1
conform to variance v2
?
This is the case if the variances are the same or sym
is nonvariant.
Do the variances of type parameters tparams1
conform to the variances
of corresponding type parameters tparams2
?
This is only the case of tparams1
and tparams2
have the same length.