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
- Source
- TailCalls.scala
Type members
Classlikes
This class represents a tailcalling computation
This class represents a tailcalling computation
- Source
- TailCalls.scala
Value members
Concrete methods
Used to return final result from tailcalling computation
Used to return final result from tailcalling computation
- Value Params
- `result`
the result value
- Returns
a
TailRec
object representing a computation which immediately returnsresult
- Source
- TailCalls.scala
Performs a tailcall
Performs a tailcall
- Value Params
- rest
the expression to be evaluated in the tailcall
- Returns
a
TailRec
object representing the expressionrest
- Source
- TailCalls.scala