Странные вещи с функцией карри

У меня странная ситуация, которую я не понимаю. Я читаю книгу "Программирование в 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.

Другие вопросы по тегам