2

プロジェクトのコンポーネントへの依存関係として json デコーダーを挿入するために使用される特性があります。

trait JsonDecoder {
  def apply[T](s: String): Option[T]
}

Circeで実装しようとすると:

import io.circe.generic.auto._
import io.circe.parser.decode

case class CirceJsonDecoder() extends JsonDecoder {
  def apply[T](s: String): Option[T] = {
    decode[T](s).fold(_ => None, s => Some(s)) 
  }
}

そして実行します:

case class C()

def test(d: JsonDecoder) = d[C]("{}")

test(CirceJsonDecoder())

エラーでコンパイルされません:

could not find implicit value for parameter decoder: io.circe.Decoder[T]

またはコンテキスト境界を追加しようとしましたがClassTag、の暗黙的な値をまだ見つけることができません。TypeTagWeakTypeTagTDecoder

Decoderコンテキスト バインドまたは暗黙のパラメーターを追加することはできませんJsonDecoder.apply。これを使用するコンポーネントは実装の詳細を認識できないためです。

暗黙的に提供するにはどうすればよいio.circe.Decoderですか? からそれを取得する方法があるかもしれTypeTagませんか?

4

1 に答える 1

4

circe を含む方法で適用メソッドの署名に影響を与えずにできるとは思いません。可能であれば、それはcirce.auto_、暗黙のデコーダーを任意の型 T のスコープに入れることができることを意味しますが、これは正しくありません。

私の知る限り、関数に暗黙Decoderを追加して、この型を実際に処理する方法を知っていることを知らせるよりも優れた型注釈はありません(必要に応じて、バージョンを使用できますがT: Decoder、最終的には同じです)。

于 2016-12-09T15:24:25.267 に答える