По значению и по имени в scala => однозначное соответствие
Если при вызове по значению
val f: (Int) => Int = {(i) => {i * i}} # f: Int => Int = <function1>
это сокращение для val f: Function1[Int, Int] = {(i) => {i * i}} # f: Int => Int = <function1>
тогда при звонке по имени val f: (=> Int) => Int = {(i) => {i * i}} # f: (=> Int) => Int = <function1>
это сокращение для
? что?
и если
при вызове по значению
val f = {(i) => {i * i}}:(Int) => Int # f: Int => Int = <function1>
это сокращение для val f = {(i) => {i * i}}:Function1[Int, Int] # f: Int => Int = <function1>
тогда при звонке по имени val f = {(i) => {i * i}}:(=>Int) => Int # f: (=> Int) => Int = <function1>
это сокращение для
? что?
другими словами
if (Int) => Int является сокращением для Function1 [Int, Int]
then (=> Int) => Int - это сокращение от ? что?
Спасибо!
2 ответа
Это ничего не значит. Типы имен - это типы имен. См. SLS 4.6.1, http://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html.
Это правда, что если вы посмотрите на полученный байт-код, вы увидите, что аргумент будет передан как Function0
, но это детали реализации на уровне байт-кода. На уровне языка типы имен не просто синтаксический сахар. Они являются действительными типами (хотя они могут появляться только как типы параметров, но не в других контекстах).
Смотрите также: Использование параметров по имени Scala
На уровне байт-кода это сокращение для:
Function1[Function0[Int], Int]
Если вы хотите вызвать такой код Scala с другого языка JVM, вам придется заполнить эту подпись.
Смотрите исходный код для Function0, вы не найдете его в скаляр