gpt4 book ai didi

scala - 为什么 scala @tailrec 不能用于 Option.flatMap?

转载 作者:行者123 更新时间:2023-12-04 18:00:50 25 4
gpt4 key购买 nike

在 scala 中,以下 2 个函数的作用完全相同:

@tailrec
final def fn(str: String): Option[String] = {
Option(str).filter(_.nonEmpty).flatMap { v =>
fn(v.drop(1))
}
}

@tailrec
final def fn2(str: String): Option[String] = {
Option(str).filter(_.nonEmpty) match {
case None => None
case Some(v) => fn2(v.drop(1))
}
}

然而@tailrec 只适用于第二种情况,在第一种情况下它会产生以下错误:

Error: could not optimize @tailrec annotated method fn: it contains a recursive call not in tail position Option(str).filter(_.nonEmpty).flatMap { v =>



为什么会出现这个错误?以及为什么这 2 个代码会生成不同类型的 JVM 字节码

最佳答案

对于 fn要成为尾递归,递归调用必须是函数中的最后一个 Action 。如果您通过 fn到另一个函数,例如 flatMap然后另一个函数在调用fn后可以自由执行其他操作因此编译器不能确定它是尾递归的。

在某些情况下,编译器可以检测到调用 fn是另一个函数中的最后一个 Action ,但不是一般情况下。这将依赖于其他函数的特定实现,因此 tailrec如果更改了其他函数,则注释可能会无效,这是一种不希望的依赖项。

关于scala - 为什么 scala @tailrec 不能用于 Option.flatMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54833910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com