【发布时间】:2012-12-11 00:01:44
【问题描述】:
我计划在我的 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
基本上,我希望能够根据来自 List 的参数组合 monad - 在 list 的每个元素上运行 monadic 函数并在我进行时累积副作用。我了解示例语法不起作用,并且我明白为什么它不起作用 - 我只是在寻找一个干净、优雅的等价物。
我很确定使用 scalaz monad 转换器可以实现这一点,更具体地说是使用 StateT,但我不确定如何去做。
附言。我使用的是 Scalaz 7.0-M3,因此语法可能与最常见的 6.x 略有不同。
【问题讨论】:
标签: scala monads scalaz monad-transformers scalaz7