用法:
object TailCalls
此对象导出的方法通过蹦床实现尾调用。尾调用方法必须使用 done
返回其结果或使用 tailcall
调用下一个方法。两者都返回一个TailRec
对象。可以使用方法 result
从 Tailrec
值中检索尾调用函数的评估结果。按照“带有免费 Monads 的 Stackless Scala”https://blog.higher-order.com/assets/trampolines.pdf 中的说明实现
这是一个使用示例:
import scala.util.control.TailCalls._
def isEven(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail))
def isOdd(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail))
isEven((1 to 100000).toList).result
def fib(n: Int): TailRec[Int] =
if (n < 2) done(n) else for {
x <- tailcall(fib(n - 1))
y <- tailcall(fib(n - 2))
} yield x + y
fib(40).result
源码:
- TailCalls.scala
相关用法
- Scala control.Breaks用法及代码示例
- Scala control.Exception用法及代码示例
- Scala control.NonFatal用法及代码示例
- Scala control.ControlThrowable用法及代码示例
- Scala convert.ImplicitConversions用法及代码示例
- Scala concurrent.Future用法及代码示例
- Scala concurrent.BlockContext用法及代码示例
- Scala compiletime.summonFrom用法及代码示例
- Scala collection.Iterator用法及代码示例
- Scala compiletime.error用法及代码示例
- Scala collection.IterableOnce用法及代码示例
- Scala compiletime.erasedValue用法及代码示例
- Scala compiletime.codeOf用法及代码示例
- Scala compiletime.uninitialized用法及代码示例
- Scala collection.JavaConverters用法及代码示例
- Scala compiletime.requireConst用法及代码示例
- Scala Tabulate.sliding用法及代码示例
- Scala ArrayBuffer.inits用法及代码示例
- Scala long.BitwiseOr用法及代码示例
- Scala StringBuilder.partitionMap用法及代码示例
- Scala List distinct()用法及代码示例
- Scala DefaultMap.sizeIs用法及代码示例
- Scala StrictOptimizedIterableOps.sliding用法及代码示例
- Scala Searching.SearchResult用法及代码示例
- Scala ::.collectFirst用法及代码示例
注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 control.TailCalls。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。