如何在不理解的情况下对 Scala State Monad 应用修改列表

How to apply a list of modifciations on a scalaz State Monad without for comprehension

我目前正在玩 scalaz State Monad。我想实现一个处理管道,其中将对初始状态应用动态数量的修改。我想在完成所有处理后得出最终状态。

这是一个更好的图形示例。

                       +-------+        +-------+        +-------+
                       |       |        |       |        |       |
Initial State  +-----> |   m1  | +----> |   m2  | +----> |   m3  | +----> Final State
                       |       |        |       |        |       |
                       +-------+        +-------+        +-------+

我想出了这个代码

import  scalaz._
import  Scalaz._

object Main2 {

  def main(args: Array[String]) {

    val m1 = State[String, Unit] { (x:String) =>(x + " " + x, () )}
    val m2 = State[String, Unit] { (x:String) =>(x.toUpperCase(), () )}
    val m3 = State[String, Unit] { (x:String) =>(x.toLowerCase(), () )}

    val finalState = for(
      _ <- m1;
      _ <- m2;
      f <- m3
    ) yield (f)

    println( finalState.run("Foo") )

  }

}

这到目前为止有效,但我不知道编译时修改的确切数量,所以我不能使用 a 来理解。

我需要的是这个

import  scalaz._
import  Scalaz._

object Main2 {

  def main(args: Array[String]) {

    val m1 = State[String, Unit] { (x:String) =>(x + " " + x, () )}
    val m2 = State[String, Unit] { (x:String) =>(x.toUpperCase(), () )}
    val m3 = State[String, Unit] { (x:String) =>(x.toLowerCase(), () )}

    type MyState = State[String, Unit];

    val modifications = List[MyState](m1,m2,m3);

    modifications.???.run("Foo")

  }

}
  1. 如何在我的初始状态 Foo 上应用这个状态计算列表,使其具有与我使用 for 理解相同的效果?
  2. 如何在快速失败 方法中将其与错误处理的使用相结合?

对于我在错误处理方面的修改,这是否是一个更好的签名?

 type ModificationType = StateT[Try, String, Unit]

感谢您的帮助

好吧,简单的方法是这样的

modifications.reduceLeft((a: MyState, b:MyState) => a.flatMap(_ => b));

这本质上是对 for 理解的重写。

好像scalaz也提供了sequenceU,也可以用

modifications.sequenceU

但我不确定那个。 (我没有带 scala 编译器)

对于你的第二个问题,是的,这应该能满足你的需要。