Как Scala выводит эти две функции по-разному? - PullRequest
1 голос
/ 28 июня 2011

Это компилируется:

 def fibonacci():() => Int = {
        var first   = 1
        var second  = 2
        return () => {
            val oldFirst = first
            first = second
            second = second + oldFirst
            second 
        }
    }

Это не:

 def fibonacci():() => Int = {
     var first   = 1
     var second  = 2
     return ():Int => {
         val oldFirst = first
         first = second
         second = second + oldFirst
         second 
     }
 }

Я явно пытаюсь сказать, что я возвращаю Int, но я получаю эту ошибку:Illegal start of declaration, и он указывает на линию first = second.Насколько они разные?Я использую Scala 2.8.1.

Ответы [ 2 ]

8 голосов
/ 28 июня 2011

return (): Int => {...} не является правильным выражением в Scala.Если вы хотите явно указать тип возвращаемого значения, вам нужно поместить объявление после значения (а значением будет анонимная функция):

def fibonacci():() => Int = {
  var first   = 1
  var second  = 2
  return ( () => {
    val oldFirst = first
    first = second
    second = second + oldFirst
    second 
  } ) : () => Int
}

Обратите внимание, однако, что в этом нет необходимости.Если вы опустите return, вам вообще не нужно делать явного объявления типа:

def fibonacci() = {
  var first   = 1
  var second  = 2
  () => {
    val oldFirst = first
    first = second
    second = second + oldFirst
    second 
  }
}
6 голосов
/ 28 июня 2011

Дебильски прав. Еще два комментария: (1) Ключевое слово return не обязательно. По умолчанию последнее выражение становится возвращаемым значением. (2) Если вы пытаетесь аннотировать только тип тела функции, это возможно. Код становится:

def fibonacci2(): () => Int = {
  var first   = 1
  var second  = 2
  () => {
    val oldFirst = first
    first = second
    second = second + oldFirst
    second 
  }: Int
}
...