用法:
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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。