0

我尝试将 scalaz 版本升级到7.2.18. 在之前的版本中,以下代码块运行良好。

  implicit val decode: DecodeJson[Uuid] =
    DecodeJson( cursor =>
      cursor.as[String].flatMap( str =>
        DecodeResult(
            \/.fromTryCatchThrowable[Uuid,IllegalArgumentException](from(str))
              .leftMap(exc => (exc.getMessage, cursor.history))
        ) ) )

但我升级了版本,DecodeResult(...)块给出了错误:

Type Mismatch, 
    expected: Either((String, CursorHistory), NotInferredA)
    actual  : \/((String, CursorHistory),Uuid)

如果有人能让我知道为什么会发生该错误以及上述块的正确实施,我将不胜感激。

4

1 回答 1

1

我怀疑您使用ArgonautJSON 库,并且您的DecodeJsonDecodeResult来自那里。很难猜测它以前是如何工作的,因为您没有指定升级这些库的哪些版本以及您拥有哪些其他依赖项(即代码何时工作)。

目前,问题来自这样一个事实,即期望DecodeResult来自标准 Scala 库,而您给出的是功能丰富的等效于 Scalaz 库中的 Either。此外,这些类型是同构的(具有相同的形状)并且可以很容易地相互转换,就编译器所知并且是两个不相关的类。修复它的最简单方法可能是使用方法来转换值:scala.util.EitherEitherscalaz.\/scala.util.Eitherscalaz.\/\/.toEither

implicit val decode: DecodeJson[Uuid] =
  DecodeJson(cursor =>
    cursor.as[String].flatMap(str =>
      DecodeResult(
        \/.fromTryCatchThrowable[Uuid, IllegalArgumentException](Uuid.from(str))
          .leftMap(exc => (exc.getMessage, cursor.history)).toEither
      )))

或者,您可以尝试查找之前是什么依赖项带来了从\/到 的一些自动转换Either。或者你可以自己写:

object ScalaZEitherHelper {
  implicit def scalaZToStd[A, B](scalazValue: A \/ B): Either[A, B] = scalazValue.toEither
}

然后,您的原始代码将尽可能地编译import ScalaZEitherHelper._

于 2017-12-22T07:40:28.043 回答