应用程序中的scalaz版本更新后,DecodeJson无法正常工作

时间:2017-12-22 04:13:43

标签: scala scalaz argonaut

我尝试将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)

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

1 个答案:

答案 0 :(得分:1)

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

目前问题来自于DecodeResult期望scala.util.Either来自标准Scala库的Either,而您提供的是scalaz.\/,这是功能丰富的相当于来自Scalaz库的Either。这些类型也是同构的(具有相同的形状),并且可以很容易地相互转换,只要编译器知道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._