Как определить закрытие Scala с явным типом возврата - PullRequest
1 голос
/ 04 сентября 2011

Почему это не работает в Scala:

val cloz: (Int,String => String) = (num: Int, str: String) => {
    str+"-"+num
}

Я вижу несколько примеров определения замыканий только с 1 аргументом, например:

val thingy: (Int => Int) = (num: Int) => {
    num * 2
}

Но абсолютно нигде (включая электронные книги Scala) я не смог найти никакой информации, объясняющей синтаксис замыканий "val".

Спасибо! Джейми

Ответы [ 2 ]

14 голосов
/ 04 сентября 2011

Правильный синтаксис:

val cloz: (Int, String) => String = (num: Int, str: String) => {
    str + "-" + num
}

Кстати, в этом простом случае вы также можете упростить выражение, как это (особенно если вы уже явно указали тип функции):

val cloz: (Int, String) => String = (num, str) => str + "-" + num 

Обновление

Вы также можете использовать REPL для изучения Scala - это очень хороший инструмент. Вы можете запустить его, просто запустив scala без каких-либо аргументов. Вот пример сеанса:

scala> val cloz = (num: Int, str: String) => str + "-" + num
cloz: (Int, String) => java.lang.String = <function2>

scala> val cloz: (Int, String) => String = (num: Int, str: String) => {
     |     str + "-" + num
     | }
cloz: (Int, String) => String = <function2>

scala> val cloz: (Int, String) => String = (num, str) => str + "-" + num
cloz: (Int, String) => String = <function2>

scala> def printCloz(cloz: (Int, String) => String, num: Int, str: String) = print(cloz(num, str))
printCloz: (cloz: (Int, String) => String, num: Int, str: String)Unit

Как видите, он не только позволяет в интерактивном режиме выполнять код, но и печатает информацию о типе, если вы что-то определяете.

0 голосов
/ 04 сентября 2011

Исходя из отличного ответа от @Eazy Angel, я предлагаю это для всех, кто смущен, как я:

val cloz: (Int,String) => String = (num, str) => {
    str+"-"+num
}
def f1(  clozArg: ((Int,String) => String), intArg: Int, stringArg: String  ): String = {
    clozArg(intArg,stringArg)
}
println("f1 result="+f1(cloz, 5, "okee"))

Пожалуйста, обратите внимание (пожалуйста, исправьте меня, если я ошибаюсь), что б / кПри выводе типа Scala вы не обязаны явно указывать все эти типы.До сих пор я видел только один раз, когда вы должны делать это при использовании рекурсии.

-
ОБНОВЛЕНИЕ:
Этот синтаксис причудливый работает также: (см. тип возврата в 3-й строке)

val cloz = (num: Int, str: String) => {
    str+"-"+num
} : String
def f1(  clozArg: ((Int,String) => String), intArg: Int, stringArg: String  ): String = {
    clozArg(intArg,stringArg)
}
println("f1 result="+f1(cloz, 5, "okee"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...