为什么scala @tailrec不能在Option.flatMap上使用?
发布时间:2020-12-16 18:07:06 所属栏目:安全 来源:网络整理
导读:在 scala中,以下两个函数用于完全相同的目的: @tailrecfinal def fn(str: String): Option[String] = { Option(str).filter(_.nonEmpty).flatMap { v = fn(v.drop(1)) }}@tailrecfinal def fn2(str: String): Option[String] = { Option(str).filter(_.nonE
在
scala中,以下两个函数用于完全相同的目的:
@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仅适用于第二种情况,在第一种情况下它将生成以下错误:
为什么会出现这个错误?为什么这两个代码生成不同种类的JVM字节码 解决方法
要使fn成为尾递归,递归调用必须是函数中的最后一个操作.如果将fn传递给另一个函数(如flatMap),那么另一个函数可以在调用fn后自由执行其他操作,因此编译器无法确定它是尾递归的.
在某些情况下,编译器可以检测到调用fn是另一个函数中的最后一个操作,但在一般情况下不是.并且这将依赖于该其他函数的特定实现,因此如果其他函数被更改,则tailrec注释可能变得无效,这是不期望的依赖性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – 角度 – 结构模块的最佳实践
- scala – Play Framework表单“折叠”方法命名原理
- Angular 2 Input
- angularjs – 放置在自定义指令中的ui-codemirror失败,没有
- webservice调用报object is not an instance of declaring
- Angular 2 – EXCEPTION:TypeError:无法读取属性’isSkip
- twitter-bootstrap – 更改背景颜色在twitter bootstrap模态
- 当模型元素从模型数组拼接时,AngularJS:ng-repeat列表不更
- Bash变量替换vs dirname和basename
- 数组 – 将Scala Array转换为唯一排序列表的高效方法