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