2017-08-12 59 views
0

我正在学习用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)) 
} 

编译一些代码,我无法给出这样的错误:

forward reference extends over definition of value factorial

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

什么我做错了吗?

回答

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) 
} 
+0

什么时候应该在方法上使用某个函数? – wannabe

+0

方法可以是通用的,函数不能。方法可以有多个参数列表(或没有),函数总是只有一个。方法有名字,功能不要。方法可以有重复的参数,功能不能。方法可以有可选参数,功能不可以。方法可以有隐式参数列表,函数不能。所以,如果方法可以做很多功能不能做的事情,为什么你会想要使用一个函数呢?那么,有一件非常重要的事情:功能是对象,方法不是。而且由于Scala是面向对象的语言,你只能用对象做事情。你... –

+0

...不能传递一个方法作为参数,你不能返回一个方法,你不能将一个方法分配给一个变量,你不能在数据结构中存储一个方法。你只能用对象来做到这一点。 –