我正在尝试为自定义库模拟orElse组合器。
这是代码link。
编译代码时出现错误-
type mismatch;
[error] found : scalaz.stm.STM[E,A]
[error] required: scalaz.stm.STM[Nothing,A]
[error] stmEither.flatMap(either => either.fold(e => that, r => STM.point(r)))
我尝试更改函数的签名,但这没有帮助。
final def orElse[E2 <: E](that: => STM[E2, A]): STM[E2, A] = {
val stmEither: STM[Nothing, Either[E, A]] = self.attempt
stmEither.flatMap(either => either.fold(e => that, r => STM.point(r)))
}
我不知道如何使E2成为协变和对立变体。 如何使此函数编译。
答案 0 :(得分:0)
如果您有两个值并根据某种条件返回其中一个,则返回类型将是这两种类型的最低上限。它不会比每种原始类型都具体。
类型STM[Nothing,A]
表示它不会失败。
类型STM[E2,A]
表示它可能会因类型为E2
的错误而失败。
如果分支之一容易出错,就不可能使orElse
保持正常。
但这应该可行:
final def orElse[E2 >: E](that: => STM[E2, A]): STM[E2, A]
还使用方差注释阻止AFAIK scalaz生态系统。