Skip to content

Instantly share code, notes, and snippets.

@drstevens
Forked from travisbrown/trampolined-state.scala
Last active August 29, 2015 14:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drstevens/3ea464446ee59463af1e to your computer and use it in GitHub Desktop.
Save drstevens/3ea464446ee59463af1e to your computer and use it in GitHub Desktop.
Trampolining the state monad via applicative combinator appears to work
import scalaz._, Scalaz._
def setS(i: Int): State[List[Int], Unit] = modify(i :: _)
val s = (1 to 10000).foldLeft(state[List[Int], Unit](()).lift[Free.Trampoline]) {
case (st, i) => st *> setS(i).lift[Free.Trampoline]
}
s(Nil).run
// Purposely choosing not to traverse here for demonstration purposes
val s2 = (1 to 10000).foldLeft(state[List[Int], List[Unit]](List.empty).lift[Free.Trampoline]) {
case (st, i) => (st |@| setS(i).lift[Free.Trampoline])((xs, x) => x :: xs)
}
s2(Nil).run
val s3 = (1 to 10000).toList.traverseU {
i => setS(i).lift[Free.Trampoline]
}
s3(Nil).run
@drstevens
Copy link
Author

For some reason the applicative works

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment