我正在尝试模拟自定义库的orElse组合器。
这是代码链接。
当我编译代码时,我收到错误 -
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 既是协变又是反变。 如何使此函数编译。
如果您有两个值并根据某个条件返回其中一个,则返回类型将是这两种类型的最低上限。它将不如每个原始类型具体。 类型STM[Nothing,A]
表示它不会失败。 类型STM[E2,A]
表示它可能会失败并显示类型E2
的错误。 如果其中一个分支容易出错,则不可能使orElse
失败。
但这应该有效:
final def orElse[E2 >: E](that: => STM[E2, A]): STM[E2, A]
此外,AFAIK scalaz生态系统不鼓励使用方差注释。