在Scalaz中进行故障切换的StateT[other]
我正试图在一个由在Scalaz中进行故障切换的StateT[other],scala,scalaz,Scala,Scalaz,我正试图在一个由“scalaz core”%“7.2.14”StateT Monad组成的组件中创建某种故障转移行为 StateT monad环绕着它,因此它是一个monad转换器: type Error = String type ErrOrT[T] = Error \/ T type State[T] = StateT[ErrOrT, String, T] 有了这些类型,一切都很好——我可以利用的强大功能,或者加上状态。如果出现错误,我会短路,并且可以将我的状态叠加在一个一元合成中: de
“scalaz core”%“7.2.14”
StateT Monad组成的组件中创建某种故障转移
行为
StateT monad环绕着它,因此它是一个monad转换器:
type Error = String
type ErrOrT[T] = Error \/ T
type State[T] = StateT[ErrOrT, String, T]
有了这些类型,一切都很好——我可以利用的强大功能,或者
加上状态
。如果出现错误,我会短路,并且可以将我的状态叠加在一个一元合成中:
def func1: State[Int] = ???
def func2: State[Int] = ???
def func3: State[Int] = ???
val stateMonad = for {
res1 <- func1
res2 <- func2
res3 <- func3
} yield res3
因此,由此产生的链条将是:
val stateMonad = for {
res1 <- func1
res2 <- tryWithFailover(func2)(err => failover)
res3 <- func3
} yield res3
UPD2: 错误的实现打破了整个一元链,中间有
run
:
def tryWithFailover[T](run: State[T])(failover: Error => State[T]): State[T] = {
for {
lockedState <- State(st => (st, st))
result <- run.mapT[ErrOrT, T, String] {
case ok@ \/-(_) => ok
case -\/(error) => failover(error).run(lockedState)
}
} yield result
}
def tryWithFailover[T](运行:状态[T])(故障转移:错误=>State[T]):状态[T]={
为了{
锁定状态(st,st))
结果正常
案例-\/(错误)=>故障转移(错误)。运行(锁定状态)
}
}产量结果
}
经过一些考虑,我得出结论,上述方法不错:
def tryWithFailover[T](run: State[T])(failover: Error => State[T]): State[T] = {
for {
lockedState <- State(st => (st, st))
result <- run.mapT[ErrOrT, T, String] {
case ok@DRight(_) => ok
case DLeft(error) => failover(error).run(lockedState)
}
} yield result
}
def tryWithFailover[T](运行:状态[T])(故障转移:错误=>State[T]):状态[T]={
为了{
锁定状态(st,st))
结果正常
案例DLeft(错误)=>故障转移(错误)。运行(锁定状态)
}
}产量结果
}
也许有一天会有人纠正我的答案
def tryWithFailover[T](run: State[T])(failover: Error => State[T]): State[T] = {
for {
lockedState <- State(st => (st, st))
result <- run.mapT[ErrOrT, T, String] {
case ok@ \/-(_) => ok
case -\/(error) => failover(error).run(lockedState)
}
} yield result
}
def tryWithFailover[T](run: State[T])(failover: Error => State[T]): State[T] = {
for {
lockedState <- State(st => (st, st))
result <- run.mapT[ErrOrT, T, String] {
case ok@DRight(_) => ok
case DLeft(error) => failover(error).run(lockedState)
}
} yield result
}