Странные вещи с функцией карри - PullRequest
7 голосов
/ 28 апреля 2011

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

10 голосов
/ 28 апреля 2011

Ваш последний пример кода должен быть переписан следующим образом, чтобы получить ожидаемый результат:

withThis(5) { x =>
     println("Hello!")
     println(x)
}

В противном случае ваш пример эквивалентен

withThis(5) {
     println("Hello!")
     (x: Int) => println(x)
}

в качестве заполнителя _ будетбыть расширенным, чтобы связать как можно плотнее невырожденным способом (т. е. он не расширится до println(x => x)).

Другая вещь, на которую следует обратить внимание, это то, что блок всегда возвращает свое последнее значение.В вашем примере последнее значение на самом деле (x: Int) => println(x).

3 голосов
/ 28 апреля 2011

Во втором примере часть в curlies: { println("Hello!"); println(_) } - это блок, который печатает "Hello!" и возвращает карри println. Представьте, что это упрощено как { println("Hello!"); 5 }, блок, который печатает «Привет!» и возвращает 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...