Ответ, данный Кевином Райтом, совершенно верен, но если разбить его дальше:
Первая строка объявляет функцию с именем foo
. foo
принимает в качестве аргумента другую функцию, bar
, которая сама принимает Unit
и возвращает String
. Вообще говоря, Unit
в scala имеет то же значение, что и void
во многих других языках, поэтому вы можете сказать, что по большей части bar
является функцией, которая не принимает аргументов и возвращает String
.
Тело функции foo
просто возвращает полученный аргумент. Следовательно, Scala делает вывод, что foo
возвращает функцию, которая принимает Unit
и возвращает String
.
Вторая команда вызывает foo
с функцией a => a.toString
в качестве аргумента. Предполагается, что a
относится к типу Unit
. Если бы Unit
был точным аналогом void
, это не сработало бы. Вы не можете позвонить toString
при отсутствии чего-либо. Тем не менее, Unit
ведет себя немного по-другому, именно для таких ситуаций, и a
будет дан экземпляр Unit
. Этот экземпляр на самом деле не сможет многое сделать, но он сможет вызывать toString
. Таким образом, результатом второй команды будет функция, которая возвращает результат toString
, вызванный для экземпляра Unit
, который:
"()"