TailCalls
scala.util.control.TailCalls
object TailCalls
Methods exported by this object implement tail calls via trampolining. Tail calling methods have to return their result using done
or call the next method using tailcall
. Both return a TailRec
object. The result of evaluating a tailcalling function can be retrieved from a Tailrec
value using method result
. Implemented as described in "Stackless Scala with Free Monads" https://blog.higher-order.com/assets/trampolines.pdf
Here's a usage example:
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
Attributes
- Source
- TailCalls.scala
- Graph
-
- Supertypes
- Self type
-
TailCalls.type
Members list
In this article