Return 嵌套 for-comprehensions 处理堆叠状态和 IO monad 的最终结果
Return final result from nested for-comprehensions processing stacked State and IO monads
作为此 的后续行动,我需要处理 processResult
中收集的所有结果。但是当我 运行 我从 println(finalBusinessResult)
得到 <function1>
的代码时
编辑:它似乎只处理第 1 步,没有别的
问:如何从 processResult
得到 return 结果
case class BusinessState()
trait BusinessResult
case object KeepGoing extends BusinessResult
case object StopNow extends BusinessResult
type IOState[S, A] = StateT[IO, S, A]
type BusinessIOState[A] = IOState[BusinessState, A]
trait SomeSteps {
def step1: BusinessIOState[Unit]
def step2: BusinessIOState[BusinessState]
def decisionStep: BusinessIOState[BusinessResult]
def step3: BusinessIOState[BusinessResult]
def step4: BusinessIOState[BusinessResult]
def processResult(businessResult: BusinessResult*): BusinessIOState[BusinessResult]
def toOpt(a: BusinessIOState[BusinessResult])
: OptionT[BusinessIOState, BusinessResult] = {
OptionT.liftF(a).filter(_ == KeepGoing)
}
def program: BusinessIOState[Unit] = (for {
_ <- step1
_ <- step2
businessResult <- (for {
businessResult1 <- toOpt(decisionStep)
businessResult2 <- toOpt(step3)
businessResult3 <- toOpt(step4)
} yield processResult(businessResult1, businessResult2, businessResult3)).getOrElse(())
} yield businessResult)
}
object Impl extends SomeSteps {
def step1 = Monad[BusinessIOState].unit
def step2 = Monad[BusinessIOState].pure(BusinessState())
def decisionStep = StateT.liftF(IO { println("dS"); KeepGoing })
def step3 = StateT.liftF(IO { println("3"); KeepGoing })
def step4 = StateT.liftF(IO { println("4"); KeepGoing })
def processResult(businessResult: BusinessResult*): BusinessIOState[BusinessResult] =
StateT.liftF(IO { println("5"); KeepGoing })
}
def run(args: List[String]) = {
val finalBusinessResult = for {
businessResult <- Impl.program.runA(BusinessState())
} yield businessResult
println(finalBusinessResult)
IO.pure(ExitCode.Success)
}
在这些回复的帮助下,我设法让它正常工作。
object StopIO extends IOApp {
case class BusinessState()
trait BusinessResult
case object KeepGoing extends BusinessResult
case object StopNow extends BusinessResult
type IOState[S, A] = StateT[IO, S, A]
type BusinessIOState[A] = IOState[BusinessState, A]
trait SomeSteps {
def step1: BusinessIOState[Unit]
def step2: BusinessIOState[Unit]
def decisionStep: BusinessIOState[BusinessResult]
def step3: BusinessIOState[BusinessResult]
def step4: BusinessIOState[BusinessResult]
def processResult(businessResult: BusinessResult*): BusinessIOState[BusinessResult]
def toOpt(a: BusinessIOState[BusinessResult]): OptionT[BusinessIOState, BusinessResult] = {
OptionT.liftF(a).filter(_ == KeepGoing)
}
def program = (for {
_ <- step1
_ <- step2
businessResult <- (for {
businessResult1 <- toOpt(decisionStep)
businessResult2 <- toOpt(step3)
businessResult3 <- toOpt(step4)
businessResult4 <- toOpt(processResult(businessResult1, businessResult2, businessResult3))
} yield businessResult4).getOrElse(KeepGoing)
} yield businessResult)
}
object Impl extends SomeSteps {
def step1 = Monad[BusinessIOState].unit
def step2 = Monad[BusinessIOState].pure(KeepGoing)
def decisionStep = StateT.liftF(IO { println("dS"); KeepGoing })
def step3 = StateT.liftF(IO { println("3"); KeepGoing })
def step4 = StateT.liftF(IO { println("4"); KeepGoing })
def processResult(businessResult: BusinessResult*) = StateT.liftF(IO { println("5"); KeepGoing })
}
def run(args: List[String]) = {
val ioResult = for {
businessResult <- Impl.program.runA(BusinessState())
} yield businessResult
println(ioResult.unsafeRunSync())
IO.pure(ExitCode.Success)
}
}
作为此 processResult
中收集的所有结果。但是当我 运行 我从 println(finalBusinessResult)
<function1>
的代码时
编辑:它似乎只处理第 1 步,没有别的
问:如何从 processResult
case class BusinessState()
trait BusinessResult
case object KeepGoing extends BusinessResult
case object StopNow extends BusinessResult
type IOState[S, A] = StateT[IO, S, A]
type BusinessIOState[A] = IOState[BusinessState, A]
trait SomeSteps {
def step1: BusinessIOState[Unit]
def step2: BusinessIOState[BusinessState]
def decisionStep: BusinessIOState[BusinessResult]
def step3: BusinessIOState[BusinessResult]
def step4: BusinessIOState[BusinessResult]
def processResult(businessResult: BusinessResult*): BusinessIOState[BusinessResult]
def toOpt(a: BusinessIOState[BusinessResult])
: OptionT[BusinessIOState, BusinessResult] = {
OptionT.liftF(a).filter(_ == KeepGoing)
}
def program: BusinessIOState[Unit] = (for {
_ <- step1
_ <- step2
businessResult <- (for {
businessResult1 <- toOpt(decisionStep)
businessResult2 <- toOpt(step3)
businessResult3 <- toOpt(step4)
} yield processResult(businessResult1, businessResult2, businessResult3)).getOrElse(())
} yield businessResult)
}
object Impl extends SomeSteps {
def step1 = Monad[BusinessIOState].unit
def step2 = Monad[BusinessIOState].pure(BusinessState())
def decisionStep = StateT.liftF(IO { println("dS"); KeepGoing })
def step3 = StateT.liftF(IO { println("3"); KeepGoing })
def step4 = StateT.liftF(IO { println("4"); KeepGoing })
def processResult(businessResult: BusinessResult*): BusinessIOState[BusinessResult] =
StateT.liftF(IO { println("5"); KeepGoing })
}
def run(args: List[String]) = {
val finalBusinessResult = for {
businessResult <- Impl.program.runA(BusinessState())
} yield businessResult
println(finalBusinessResult)
IO.pure(ExitCode.Success)
}
在这些回复的帮助下,我设法让它正常工作。
object StopIO extends IOApp {
case class BusinessState()
trait BusinessResult
case object KeepGoing extends BusinessResult
case object StopNow extends BusinessResult
type IOState[S, A] = StateT[IO, S, A]
type BusinessIOState[A] = IOState[BusinessState, A]
trait SomeSteps {
def step1: BusinessIOState[Unit]
def step2: BusinessIOState[Unit]
def decisionStep: BusinessIOState[BusinessResult]
def step3: BusinessIOState[BusinessResult]
def step4: BusinessIOState[BusinessResult]
def processResult(businessResult: BusinessResult*): BusinessIOState[BusinessResult]
def toOpt(a: BusinessIOState[BusinessResult]): OptionT[BusinessIOState, BusinessResult] = {
OptionT.liftF(a).filter(_ == KeepGoing)
}
def program = (for {
_ <- step1
_ <- step2
businessResult <- (for {
businessResult1 <- toOpt(decisionStep)
businessResult2 <- toOpt(step3)
businessResult3 <- toOpt(step4)
businessResult4 <- toOpt(processResult(businessResult1, businessResult2, businessResult3))
} yield businessResult4).getOrElse(KeepGoing)
} yield businessResult)
}
object Impl extends SomeSteps {
def step1 = Monad[BusinessIOState].unit
def step2 = Monad[BusinessIOState].pure(KeepGoing)
def decisionStep = StateT.liftF(IO { println("dS"); KeepGoing })
def step3 = StateT.liftF(IO { println("3"); KeepGoing })
def step4 = StateT.liftF(IO { println("4"); KeepGoing })
def processResult(businessResult: BusinessResult*) = StateT.liftF(IO { println("5"); KeepGoing })
}
def run(args: List[String]) = {
val ioResult = for {
businessResult <- Impl.program.runA(BusinessState())
} yield businessResult
println(ioResult.unsafeRunSync())
IO.pure(ExitCode.Success)
}
}