summaryrefslogtreecommitdiff
path: root/src/eclipse
diff options
context:
space:
mode:
authorGeorge Leontiev <folone@gmail.com>2013-08-19 21:57:50 +0200
committerGeorge Leontiev <folone@gmail.com>2013-08-24 09:57:35 +0200
commitfdc543760d619e287f980d5cadb183993ff6004c (patch)
tree0e0624bef4521aa3645fe8f165b5876e73b034b3 /src/eclipse
parent168d27020b4b2b3c78365137e99ca1e85c90b01a (diff)
downloadscala-fdc543760d619e287f980d5cadb183993ff6004c.tar.gz
scala-fdc543760d619e287f980d5cadb183993ff6004c.tar.bz2
scala-fdc543760d619e287f980d5cadb183993ff6004c.zip
Alter TailRec to have map and flatMap
As described in the "Stackless Scala with Free Monads" paper scala> import scala.util.control.TailCalls._ import scala.util.control.TailCalls._ scala> :paste // Entering paste mode (ctrl-D to finish) 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)) // Exiting paste mode, now interpreting. isEven: (xs: List[Int])util.control.TailCalls.TailRec[Boolean] isOdd: (xs: List[Int])util.control.TailCalls.TailRec[Boolean] scala> isEven((1 to 100000).toList).result res0: Boolean = true scala> 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: (n: Int)util.control.TailCalls.TailRec[Int] scala> fib(40).result res1: Int = 102334155
Diffstat (limited to 'src/eclipse')
0 files changed, 0 insertions, 0 deletions