前向参考扩展了价值的定义

时间:2017-08-12 19:50:39

标签: scala

我在Scala中学习嵌套函数,这里有一些我遇到问题的代码

object Main extends App {
    val fac = (x: Int) => {
        val factorial: (Int, Int) => Int = (x, accum) => if (x == 1) accum else factorial(x-1, accum*x)
        factorial(x,1)
    }

    println(fac(3))
}

编译器给出了这个错误:

  

前向引用扩展了对价值因子的定义

     

val factorial:(Int,Int)=> Int =(x,accum)=> if(x == 1)accum else factorial(x-1,accum * x)**

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您应该使用factorial而不是def声明val

  • 使用val表示它是,在声明时评估一次;因此,很容易理解为什么编译器在评估时无法使用该定义
  • 使用def表示它是方法,每次调用都会单独评估,因此支持在定义中引用自身(递归)

写这个的方法可能不那么令人困惑,那就是将此方法声明为需要参数的方法,而不是返回需要这些参数的函数的方法:

val fac = (x: Int) => {
  def factorial(x: Int, accum: Int): Int = if (x == 1) accum else factorial(x-1, accum*x)
  factorial(x,1)
}