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

时间:2018-08-30 14:01:18

标签: scala

我正在尝试为自定义库模拟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成为协变和对立变体。 如何使此函数编译。

1 个答案:

答案 0 :(得分:0)

如果您有两个值并根据某种条件返回其中一个,则返回类型将是这两种类型的最低上限。它不会比每种原始类型都具体。 类型STM[Nothing,A]表示它不会失败。 类型STM[E2,A]表示它可能会因类型为E2的错误而失败。 如果分支之一容易出错,就不可能使orElse保持正常。

但这应该可行: final def orElse[E2 >: E](that: => STM[E2, A]): STM[E2, A]

还使用方差注释阻止AFAIK scalaz生态系统。