Context Functions - More Details
Syntax
Type ::= ...
| FunArgTypes ‘?=>’ Type
Expr ::= ...
| FunParams ‘?=>’ Expr
Context function types associate to the right, e.g. S ?=> T ?=> U
is the same as S ?=> (T ?=> U)
.
Implementation
Context function types are shorthands for class types that define apply
methods with context parameters. Specifically, the N
-ary function type
T1, ..., TN ?=> R
is a shorthand for the class type ContextFunctionN[T1, ..., TN, R]
. Such class types are assumed to have the following definitions, for any value of N >= 1
:
package scala
trait ContextFunctionN[-T1, ..., -TN, +R]:
def apply(using x1: T1, ..., xN: TN): R
Context function types erase to normal function types, so these classes are generated on the fly for typechecking, but not realized in actual code.
Context function literals (x1: T1, ..., xn: Tn) ?=> e
map context parameters xi
of types Ti
to the result of evaluating the expression e
. The scope of each context parameter xi
is e
. The parameters must have pairwise distinct names.
If the expected type of the context function literal is of the form scala.ContextFunctionN[S1, ..., Sn, R]
, the expected type of e
is R
and the type Ti
of any of the parameters xi
can be omitted, in which case Ti = Si
is assumed. If the expected type of the context function literal is some other type, all context parameter types must be explicitly given, and the expected type of e
is undefined. The type of the context function literal is scala.ContextFunctionN[S1, ...,Sn, T]
, where T
is the widened type of e
. T
must be equivalent to a type which does not refer to any of the context parameters xi
.
The context function literal is evaluated as the instance creation expression
new scala.ContextFunctionN[T1, ..., Tn, T]:
def apply(using x1: T1, ..., xn: Tn): T = e
A context parameter may also be a wildcard represented by an underscore _
. In that case, a fresh name for the parameter is chosen arbitrarily.
Note: The closing paragraph of the Anonymous Functions section of Scala 2.13 is subsumed by context function types and should be removed.
Context function literals (x1: T1, ..., xn: Tn) ?=> e
are automatically created for any expression e
whose expected type is scala.ContextFunctionN[T1, ..., Tn, R]
, unless e
is itself a context function literal. This is analogous to the automatic insertion of scala.Function0
around expressions in by-name argument position.
Context function types generalize to N > 22
in the same way that function types do, see the corresponding documentation.
Examples
See the section on Expressiveness from Simplicitly: foundations and applications of implicit function types.
Type Checking
After desugaring no additional typing rules are required for context function types.