Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala @tailrec为什么这个方法不使用';包含不在尾部位置的递归调用';?_Scala_Recursion_Functional Programming - Fatal编程技术网

Scala @tailrec为什么这个方法不使用';包含不在尾部位置的递归调用';?

Scala @tailrec为什么这个方法不使用';包含不在尾部位置的递归调用';?,scala,recursion,functional-programming,Scala,Recursion,Functional Programming,此方法不编译,并抱怨它“包含一个不在尾部位置的递归调用”。有人能给我解释一下发生了什么事吗?此错误消息对我没有意义。如果指定了泛型类型,则编译正常: @tailrec private def loop[V](key: String): V = { key match { case _ => loop(key) } } 我认为在这种情况下,错误信息具有误导性 一个简化的版本给出了一个更好的提示: import scala.annotation.tai

此方法不编译,并抱怨它“包含一个不在尾部位置的递归调用”。有人能给我解释一下发生了什么事吗?此错误消息对我没有意义。

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

  @tailrec
  private def loop[V](key: String): V = {
    key match {
      case _ => loop(key)
    }
  }
我认为在这种情况下,错误信息具有误导性

一个简化的版本给出了一个更好的提示:

import scala.annotation.tailrec

 @tailrec
  private def loop[V](key: String): V = {
    key match {
      case _ => loop[V](key)
    }
  }
scala>@tailrec
|专用def循环[V](键:字符串):V={
|循环(键)
|   }
:14:错误:无法优化@tailrec注释的方法循环:使用不同的类型参数递归调用它
循环(键)
^

只有一个
案例的模式匹配
不起作用sense@cchantep这是一个最小化问题。@cchantep只是为了演示这个问题。这个方法显然没有意义,如果循环永不结束,如何使用它?您可以从
-Ydebug-Ylog:tailcalls
获得一些帮助。它似乎保留了最后的失败。也许它被模式匹配的algo弄糊涂了,有一条代码注释说,出于这个原因,它以前在typer之前运行。谢谢!这就是为什么我发现这个错误具有误导性。不知何故,添加模式匹配会掩盖死亡下的错误
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)
           ^