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
class Object
trait Matchable
class Any
Self type

Members list

Concise view

Type members

Classlikes

sealed abstract class TailRec[+A]

This class represents a tailcalling computation

This class represents a tailcalling computation

Attributes

Source:
TailCalls.scala
Graph
Supertypes
class Object
trait Matchable
class Any

Value members

Concrete methods

def done[A](result: A): TailRec[A]

Used to return final result from tailcalling computation

Used to return final result from tailcalling computation

Attributes

`result`

the result value

Returns:

a TailRec object representing a computation which immediately returns result

Source:
TailCalls.scala
def tailcall[A](rest: => TailRec[A]): TailRec[A]

Performs a tailcall

Performs a tailcall

Attributes

rest

the expression to be evaluated in the tailcall

Returns:

a TailRec object representing the expression rest

Source:
TailCalls.scala