, traverseSTrampoline, . , , :
import scalaz._, scalaz.std.list._, scalaz.syntax.traverse._
(0 to 10000).toList.traverseU(_ => State.get[Unit]).run(())
( , traverseS traverseSTrampoline State):
(0 to 10000).toList.traverseS(_ => State.get[Unit]).run(())
, - . , :
import scalaz._
import scalaz.std.list._
import scalaz.syntax.traverse._
abstract class DepthFirstState[E, S] {
type TState[s, a] = StateT[Free.Trampoline, s, a]
def build(elem: E): TState[S, List[E]]
def go(start: E): TState[S, List[E]] = for {
xs <- build(start)
ys <- xs.traverseU(go)
} yield start :: ys.flatten
}
class RangeSearchState extends DepthFirstState[Int, Int] {
def build(elem: Int): TState[Int, List[Int]] =
MonadState[TState, Int].get.map(limit =>
if (elem < limit) List(elem + 1) else Nil
)
}
:
val (state, result) = (new RangeSearchState).go(1).run(10000).run
, State cats:
import cats.state.State
import cats.std.function._, cats.std.list._
import cats.syntax.traverse._
abstract class DepthFirstState[E, S] {
def build(elem: E): State[S, List[E]]
def go(start: E): State[S, List[E]] = for {
xs <- build(start)
ys <- xs.traverseU(go)
} yield start :: ys.flatten
}
class RangeSearchState extends DepthFirstState[Int, Int] {
def build(elem: Int): State[Int, List[Int]] =
State.get[Int].map(limit => if (elem < limit) List(elem + 1) else Nil)
}
val (state, result) = (new RangeSearchState).go(1).run(10000).run
.