如何在Scalaz State遍历中丢弃结果

时间:2014-10-27 18:14:46

标签: scala scalaz

示例:

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, ())
}

1 个答案:

答案 0 :(得分:0)

使用traverseS_代替traverseS