Skip to content

Instantly share code, notes, and snippets.

@vmarquez
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vmarquez/9888f3c55a2f18f3f2b3 to your computer and use it in GitHub Desktop.
Save vmarquez/9888f3c55a2f18f3f2b3 to your computer and use it in GitHub Desktop.
Trampoline overflow
import scalaz._
import Scalaz._
import scalaz.Free._
//calling a.run(0) blows up obviously due to stack issues
val a = (0 to 10000).map(ii => State[Int,Int](i => (i,ii)) ).foldLeft( State[Int,Int](i => (i,0)) )( (s,a) => s.flatMap(i => a.map(ii => (ii+i) )))
//calling b.run(0) blows up, not stack safe.
val b = (0 to 10000).map(ii => StateT[Free.Trampoline,Int,Int](i => Trampoline.done((i,ii))) ).foldLeft( StateT[Free.Trampoline, Int,Int](i => Trampoline.done((i,0))) )( (s,a) => s.flatMap(i => a.map(ii => (ii+i) )))
//this is one way to ensure stack safety by using liftF to go from a State[A,B] to a Free[a[State[A,a],B]
val c = (0 to 10000).map(ii => State[Int,Int](i => (i,ii)).liftF ).foldLeft( State[Int,Int](i => (i,0)).liftF )( (s,a) => s.flatMap(i => a.map(ii => (ii+i) )))
//instead of run we'll foldRun
c.foldRun(0)( (a,b) => b(a))
//Scalazzi, are there other ways?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment