I am trying to understand how to perform an operation when using foreach
. For e.g. how can I print element+1 of alist
using foreach
Using the Placeholder Syntax for Anonymous Functions in Scala is a bit tricky. The language specification says:
An expression e of syntactic category Expr binds an underscore section u, if the following two conditions hold: (1) e properly contains u, and (2) there is no other expression of syntactic category Expr which is properly contained in e and which itself properly contains u.
The bold text establishes how the Scala compiler determines which expression is the anonymous functions created with the placeholder operator - it is always the innermost expression, which properly contains the _
operator. In the case of alist.foreach(println(_+1))
, the expression that binds the underscore is _ + 1
. It is not bound by the entire println(_ + 1)
expression since _ + 1
is properly contained in println(_ + 1)
. As already written in the other answers, in that case you must use the explicit syntax for anonymous functions:
alist.foreach(x => println(x + 1))
For the sake of completeness: alist.foreach(println(_+1))
translates to alist.foreach(println(x => x + 1))
. Since println
takes arguments of various kinds, the compiler is not able to infer uniquely a type for x
and hence the missing parameter type error in that case. Even if you were to give x
a type, another error will ensue since foreach
expects a function that takes one argument of the elemental type of alist
.