Странные вещи с функцией карри
У меня странная ситуация, которую я не понимаю. Я читаю книгу "Программирование в Scala", гл. 9.
Допустим, у меня есть функция карри:
def withThis(n:Int)(op:Int=>Unit){
println("Before")
op(n);
println("After")
}
Когда я вызываю его с одним аргументом внутри специального фигурного синтаксиса, он работает как положено:
withThis(5){
(x) => {println("Hello!"); println(x); }
}
// Outputs
Before
Hello!
5
After
Однако, если я поставлю два утверждения, я получу нечто странное:
withThis(5){
println("Hello!")
println(_)
}
// Outputs
Hello!
Before
5
After
Как получилось "Привет!" печатается до "До", а затем "5" печатается внутри? Я сумасшедший?
2 ответа
Ваш последний пример кода должен быть переписан следующим образом, чтобы получить ожидаемый результат:
withThis(5) { x =>
println("Hello!")
println(x)
}
В противном случае ваш пример эквивалентен
withThis(5) {
println("Hello!")
(x: Int) => println(x)
}
в качестве заполнителя _
будет расширен, чтобы связать как можно теснее, невырожденным способом (то есть он не будет расширяться до println(x => x)
).
Еще одна вещь, которую стоит отметить, это то, что блок всегда возвращает свое последнее значение. В вашем примере последнее значение на самом деле (x: Int) => println(x)
,
Во втором примере часть в curlies: { println("Hello!"); println(_) }
это блок, который печатает "Привет!" и возвращает карри println
, Представьте, что это упрощено как { println("Hello!"); 5 }
блок, который печатает "Привет!" и возвращает 5.