类型不匹配;找到:scalaz.stm.STM[E,A] 必需:scalaz.stm.STM[Nothing,A]



我正在尝试模拟自定义库的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生态系统不鼓励使用方差注释。

最新更新