@tailrec为什么这个方法不能用'包含不在尾部位置的递归调用'进行编译?

use*_*088 2 recursion functional-programming scala

  @tailrec
  private def loop[V](key: String): V = {
    key match {
      case _ => loop(key)
    }
  }
Run Code Online (Sandbox Code Playgroud)

此方法不编译并抱怨它"包含不在尾部位置的递归调用".有人可以向我解释发生了什么事吗?此错误消息对我没有意义.

Den*_*nko 10

如果指定泛型类型,它编译正常:

import scala.annotation.tailrec

 @tailrec
  private def loop[V](key: String): V = {
    key match {
      case _ => loop[V](key)
    }
  }
Run Code Online (Sandbox Code Playgroud)

我认为错误信息在这种情况下具有误导性.

简化版本可以更好地暗示正在发生的事情:

scala>  @tailrec
     |   private def loop[V](key: String): V = {
     |     loop(key)
     |   }
<console>:14: error: could not optimize @tailrec annotated method loop: it is called recursively with different type arguments
           loop(key)
           ^
Run Code Online (Sandbox Code Playgroud)

  • 你可以通过`-Ydebug -Ylog:tailcalls`获得一些帮助.它似乎保持了最后的失败.也许它被模式混淆的算法混淆了,有一个代码注释说它曾经因为这个原因在typer之前运行. (2认同)