Проблема в основном в том, что Scala нужно определить разницу между
val isOdd = ((_:Int) & 1 ) == 1
, где вы хотите, чтобы все справа от знака равенства было лямбда-выражением, и
val result = collection.map( _ + 1 )
где вы хотите, чтобы лямбда была только материалом в скобках
Scala решила, что когда вы используете подчеркивание для создания лямбды, она выберет самый внутренний набор скобок в качестве границ этой лямбды.Есть одно исключение: (_:Int)
не считается внутренними скобками, потому что его цель состоит только в том, чтобы сгруппировать декларацию с заполнителем _
.
Следовательно:
val isOdd = ((_:Int) & 1 ) == 1
^^^^^^^^^^^^^^
this is the lambda
val result = collection.map( _ + 1 )
^^^^^^^
this is the lambda
val result = collection.map(( _ + 1) / 2)
^^^^^^^^
this is the lambda
and the compiler can't infer the type of the _
val result = somemap.map(( _ + 1) / 2 * _)
^^^^^^^^
this is an inner lambda with one parameter
and the compiler can't infer the type of the _
^^^^^^^^^^^^^^^^^
this is an outer lambda with one parameter
Thisпоследний случай позволяет вам делать такие вещи, как
_.map(_ + 1)
и переводить их в
x => x.map( y=> y + 1 )