我计划开始在我的 Scala 代码中使用 Monadic 样式来处理线程状态等。这是一个结合 3 个单子函数的简化示例(并且只关心副作用)
import scalaz._
import Scalaz._
object MonadTest {
def adder(i: Int) = State[String, Int] ({str: String => (str + i.toString + " ", i) })
val oneTwoThreeMonad = for {
m1 <- adder(1)
m2 <- adder(2)
m3 <- adder(3)
} yield m3
oneTwoThreeMonad("start: ")._1 //String = "start: 1 2 3 "
}
这一切都是不言自明的,并且按预期工作。但是为了让这种方法对我真正有用,我希望能够将它与List
理解结合起来。这是一些(不起作用的)代码来说明我的意思:
val list = List(1, 2, 3)
val oneTwoThreeBis = for {
i <- list
mx <- adder(i)
} yield mx
基本上,我希望能够根据来自 a 的参数组合 monads List
- 在 的每个元素上运行 monadic 函数,list
并在我进行时累积副作用。我理解示例语法不起作用,我明白为什么它不起作用 - 我只是在寻找一个干净、优雅的等价物。
我很确定可以使用 scalaz monad 转换器来实现这一点,更具体地说,StateT
但我不确定如何去做。
PS。我使用的是 Scalaz 7.0-M3,因此语法可能与最常见的 6.x 略有不同。