2017-12-22 12 views
0

scalazバージョンを7.2.18にアップグレードしようとしました。以前のバージョンでは、コードブロックはかなりうまくいっていました。DecodeJsonがアプリケーション内のscalazバージョンの更新後に動作しない

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

JSON用にArgonautライブラリを使用し、DecodeJsonDecodeResultがそこから来たと思われます。アップグレードしたライブラリのバージョンや他の依存関係(つまりコードが動作したとき)を指定しないと、以前のように正確に動作するかどうかを推測するのは難しいです。

現在の問題は、何を与えることScalazライブラリーからのどちらかの機能が豊富な等価であるscalaz.\/ている間DecodeResultは標準のScalaライブラリからscala.util.EitherすなわちEitherを期待しているという事実から来ています。コンパイラがscala.util.Eitherscalaz.\/が2つの無関係なクラスであることが分かっている限り、これらの型は(同じ形の)同形であり、互いに簡単に変換できます。

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\/からいくつかの自動変換をもたらしたものを見つけることを試みることがあります。おそらく、それを修正する最も簡単な方法は、値を変換する\/.toEitherメソッドを使用することです。それとも、それを自分で書くことができます。

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

次に、あなたの元のコードは、限り、あなたが最初の方法は完璧import ScalaZEitherHelper._

+0

働いていたそうであるようにコンパイルします。私は2番目のオプションも試してみます。乾杯!! – Sujit

関連する問題