То же самое.Полная версия, из которой получены обе ваши версии:
val f: Int => String = (x: Int) => "Dude:" + x
В разделе 6.23 спецификации языка сказано, что если известен тип параметров ожидаемый , то вы можетеопустите тип параметров в вашей анонимной функции, что приводит к следующему:
val f: Int => String = (x) => "Dude:" + x
Затем, цитируя спецификацию: «В случае одного нетипизированного формального параметра, (x) => e может бытьсокращенно x => e. "Что приведет к этому:
val f: Int => String = x => "Dude:" + x
... которая является вашей первой версией.
Однако, если вы делаете , указываете типы параметров в вашей анонимной функции, в большинстве случаев Scala сможет определить тип вашей анонимной функции, поэтому нет необходимостиявно укажите тип функции.Это не значит, что это неправильно.Это просто избыточно.Поэтому, если вы отбросите определение типа переменной, содержащей вашу анонимную функцию, вы получите ваше второе определение.
val f = (x: Int) => "Dude:" + x
Можно ожидать, что - учитывая это - также должно быть возможно определить вашу функцию следующим образом:
scala> val f: Int => String = x: Int => "Dude:" + x
<console>:1: error: identifier expected but string literal found.
val f: Int => String = x: Int => "Dude:" + x
^
Однако это запутает компилятор.(Спецификация что-то говорит об этом. Я просто еще не смог найти это.) Если вы do хотите указать тип параметра вашей анонимной функции (как я уже сказал, нет причин для этогосделайте это), и вы захотите опустить скобки, тогда это будет работать:
val f: Int => String = { x: Int => "Dude:" + x }