【问题标题】:@tailrec why does this method not compile with 'contains a recursive call not in tail position'?@tailrec 为什么这个方法不能用“包含一个不在尾部位置的递归调用”来编译?
【发布时间】:2017-07-28 02:40:09
【问题描述】:
  @tailrec
  private def loop[V](key: String): V = {
    key match {
      case _ => loop(key)
    }
  }

此方法无法编译并抱怨它“包含不在尾部位置的递归调用”。有人可以向我解释发生了什么吗?这个错误信息对我来说没有意义。

【问题讨论】:

  • 模式匹配只有一个case _没有意义
  • @cchantep 这是一个最小化。
  • @cchantep 只是为了演示这个问题。这种方法显然没有意义
  • 如果循环永远不会结束,如何使用它?

标签: scala recursion functional-programming


【解决方案1】:

如果指定了泛型类型就可以编译:

import scala.annotation.tailrec

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

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

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

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)
           ^

【讨论】:

  • 您可以通过-Ydebug -Ylog:tailcalls 获得一些帮助。它似乎保留了最后的失败。也许它对模式匹配的算法感到困惑,有一个代码注释说它曾经因为这个原因在 typer 之前运行。
  • 谢谢!这就是为什么我发现该错误具有误导性。不知何故添加模式匹配掩盖了错误的死亡
猜你喜欢
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多