По значению и по имени в 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, вы не найдете его в скаляр

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