TailCalls
Methods exported by this object implement tail calls via trampolining.
Tail calling methods must either return their result using done or call the next method using tailcall. Both return an instance of TailRec. 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
Type members
Classlikes
This class represents a tailcalling computation.
Value members
Concrete methods
Return the final result from a tailcalling computation.
Return the final result from a tailcalling computation.
Value parameters
- `result`
-
the result value
Attributes
- Returns
-
a
TailRecobject representing a computation which immediately returnsresult - Source
- TailCalls.scala
Perform a tailcall.
Perform a tailcall.
Value parameters
- rest
-
the expression to be evaluated in the tailcall
Attributes
- Returns
-
a
TailRecobject representing the expressionrest - Source
- TailCalls.scala