Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scalaz中进行故障切换的StateT[other]_Scala_Scalaz - Fatal编程技术网

在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
}