Scala 返回Eithers和EitherTs的函数上的“orElse”操作

Scala 返回Eithers和EitherTs的函数上的“orElse”操作,scala,functional-programming,monads,scalaz,Scala,Functional Programming,Monads,Scalaz,为了从左侧的“fail”值恢复,在Scala/Scalaz中链接或\/类型相当容易 除了函数T1,T2=>Future[A\/B],如何获得相同的行为 我已经能够从两个不同的方向将其分解,但无法将解决方案组合起来 通过简单地利用Scalaz的EitherT作为Future类型[A,B]=EitherT[Future,A,B]和Future的monad实例,很容易链接Future[A\/B] 我还可以使用EitherT链接T1、T2=>A\/B类型: 如何为类型T1、T2=>Future[a\/B

为了从左侧的“fail”值恢复,在Scala/Scalaz中链接或\/类型相当容易

除了函数T1,T2=>Future[A\/B],如何获得相同的行为

我已经能够从两个不同的方向将其分解,但无法将解决方案组合起来

通过简单地利用Scalaz的EitherT作为Future类型[A,B]=EitherT[Future,A,B]和Future的monad实例,很容易链接Future[A\/B]

我还可以使用EitherT链接T1、T2=>A\/B类型:

如何为类型T1、T2=>Future[a\/B]编写一个适用于两级嵌套的转换器

我对函数式编程的了解仍在进行中,因此我为糟糕的措辞和术语用法道歉。

如果您有一个选项而不是未来,您可以在堆栈中添加一层:

def wrap[T1, T2, A, B](f: (T1, T2) => Option[A \/ B]) = EitherT[
  ({ type L1[a] = OptionT[
    ({ type L2[b] = (T1, T2) => b })#L2, a
  ] })#L1, A, B
](OptionT[({ type L2[b] = (T1, T2) => b })#L2, A \/ B](f))
这是一个混乱,但你可以相当机械地填充类型,因为你只是从内到外移动——例如,我们的T1,T2=>选项[a\/\uu]变成了一个EitherT[OptionT[T1,T2=>\uu,\u],a,\u]

问题是,如果你想用未来来做这件事,你需要一个未来,大家的共识是,既然它是

def wrap[T1, T2, A, B](f: (T1, T2) => Option[A \/ B]) = EitherT[
  ({ type L1[a] = OptionT[
    ({ type L2[b] = (T1, T2) => b })#L2, a
  ] })#L1, A, B
](OptionT[({ type L2[b] = (T1, T2) => b })#L2, A \/ B](f))