如何在不理解的情况下对 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")
}
}
- 如何在我的初始状态 Foo 上应用这个状态计算列表,使其具有与我使用 for 理解相同的效果?
- 如何在快速失败 方法中将其与错误处理的使用相结合?
对于我在错误处理方面的修改,这是否是一个更好的签名?
type ModificationType = StateT[Try, String, Unit]
感谢您的帮助
好吧,简单的方法是这样的
modifications.reduceLeft((a: MyState, b:MyState) => a.flatMap(_ => b));
这本质上是对 for 理解的重写。
好像scalaz也提供了sequenceU
,也可以用
modifications.sequenceU
但我不确定那个。 (我没有带 scala 编译器)
对于你的第二个问题,是的,这应该能满足你的需要。
我目前正在玩 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")
}
}
- 如何在我的初始状态 Foo 上应用这个状态计算列表,使其具有与我使用 for 理解相同的效果?
- 如何在快速失败 方法中将其与错误处理的使用相结合?
对于我在错误处理方面的修改,这是否是一个更好的签名?
type ModificationType = StateT[Try, String, Unit]
感谢您的帮助
好吧,简单的方法是这样的
modifications.reduceLeft((a: MyState, b:MyState) => a.flatMap(_ => b));
这本质上是对 for 理解的重写。
好像scalaz也提供了sequenceU
,也可以用
modifications.sequenceU
但我不确定那个。 (我没有带 scala 编译器)
对于你的第二个问题,是的,这应该能满足你的需要。