如何将Seq [State [S,A]]转换为状态[S,A]

时间:2015-11-30 16:21:30

标签: monads scalaz

是否有现有的组合器来执行此操作。

这是我现有的代码

  private def traverse(states: Seq[State[Set[Tip], Unit]]) : State[Set[Tip], Unit] = {
    states.reduce((a,b) => for { _ <- a
                                 bb <- b } yield bb)
  }

1 个答案:

答案 0 :(得分:1)

首先,monadic绑定有一个更简单的语法,忽略第一个monad的值 - >>

import scalaz.State
import scalaz.syntax.monad._

val states: List[State[Set[Tip], Unit]] = ???

states.reduce((a, b) => a >> b)

但也有一种特殊的方法可以做你想做的事,即Foldable.sequenceS_

import scalaz.State
import scalaz.std.iterable._
import scalaz.syntax.foldable._

val states: List[State[Set[Tip], Unit]] = ???

states.sequenceS_[Set[Tip], Unit]