嵌套递归函数的 Scala 前向引用

标签 scala recursion forward-reference

我有一个带有嵌套递归函数的非常简单的方法定义:

def bar(arr : Array[Int]) : Int = {
  val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

但是我得到这个错误:

<console>:36: error: forward reference extends over definition of value foo
     val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
                                                              ^

如果我只是将 val foo: ... = ... 单独放在一行,而不是嵌套在 def 中,一切正常

最佳答案

你可以让它成为一个lazy val:

def bar(arr : Array[Int]) : Int = {
  lazy val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

def:

def bar(arr : Array[Int]) : Int = {
  def foo(i: Int): Int = if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

当你

put the val foo: ... = ... line by itself, and not nested within a def

它变成了一个字段和一个getter方法的组合,foo(i-1)实际上调用了getter方法而不是引用你定义的 ,这是非法的;但是当你在一个方法中有一个 val 时,它只是一个局部变量并且没有 getter 方法。

关于嵌套递归函数的 Scala 前向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768145/

相关文章:

scala - 处理Scala ZIO中的错误

SQL递归方法添加自增

java - 适用于 Android 的 OpenCV : Illegal Forward Reference

reactjs - React Refs 与 TypeScript : Cannot read property 'current' of undefined

Scala:类型模式匹配期间的前向引用错误

scala - List[String] 的 QueryStringBinder

java - Google secret 管理器 API 和 Google 存储 API 不适用于 Apache Spark

scala - 如何使用@See scaladoc?

python - python中单链表类的递归实现

javascript - 为什么异步函数比同步函数需要更多时间来执行?