示例:
import scalaz._
import Scalaz._
def setS(i: Int): State[List[Int], Unit] = modify(i :: _)
val state = (1 to 1000000).toList traverseS setS
val (finalState, result) = state(Nil)
我的状态函数setS
的结果类型为Unit
。这意味着我对结果不感兴趣。然而,当我像这样运行我的状态一百万次时,我最终将得到包含一百万个result
实例的Unit
集合,我将立即使用val (finalState, _) = state(Nil)
丢弃这些实例。这似乎很浪费。
有没有办法在没有收集结果的情况下运行这种状态转换?
来自example-of-state-and-free-monad-in-scalaz的解决方案:
import scalaz._
import Scalaz._
import Free._
def setS(i :Int) :State[List[Int], Unit] = modify(i :: _)
val s = (1 to 1000000).foldLeft(state[List[Int], Unit](()).lift[Trampoline]) {
case (st, i) => st *> setS(i).lift[Trampoline]
}
val (finalState, result) = s(Nil).run
我想你总能写出类似的内容:
def traverseUnitS[S](t :Traversable[State[S, Unit]]) :State[S, Unit] = State[S, Unit] {
state0 =>
val sout = t.foldLeft(state0)((s, st) => st.run(s)._1)
(sout, ())
}
答案 0 :(得分:0)
使用traverseS_
代替traverseS
。