1

私は合計タイプ、マッピングを持っています:

sealed trait Mapping
final case class XMapping(a:String)
final case class FallbackMapping(mappings: List[Mapping])

次のように定義された型クラスがあります。

final case class Param(x:String)

trait ParameterLoader[T] {
  def load(mapping:T) : List[Param]
}

いくつかの例では:

object DefaultParameterLoaders {
  implicit val  xParameterLoader= new QueryParameterLoader[XMapping] {
    override def load(mapping: XMapping): List[Param] = List(Param(mapping.a))
  }

  implicit val fallbackParameterLoader = new ParameterLoader[FallbackMapping] {

    override def load(mapping: FallbackMapping): List[Param] =
      mapping.mappings.flatMap(x => ???)

  }
}

上記の flatMap に暗黙的なインスタンスを渡す方法が見つかりません。ParameterLoader[Mapping] のインスタンスが見つからないというエラーが表示されます。スコープ内にある型クラスのインスタンスを使用する必要があることをコンパイラに伝える方法はありますか?

4

1 に答える 1

2

型システムは具体的に探しています。ParameterLoader[Mapping]つまり、ParameterLoader[XMapping]/ParameterLoader[FallbackMapping]は十分に具体的ではありません。を提供する必要がありますParameterLoader[Mapping]。これは、既存の定義を使用して行うことができます。

implicit def mappingLoader(implicit xpLoader: ParameterLoader[XMapping], fmLoader: ParameterLoader[FallbackMapping]) = new ParameterLoader[Mapping] { 
  def load(mapping: Mapping): List[QueryParam] = 
    mapping match {
      case xm: XMapping = xpLoader.load(xm)
      case fm: FallbackMapping => fmLoader.load(fm)
    }
}

または、フラットマップにマッチング ロジックを実行させます。

implicit def fallbackParameterLoader(implicit xpLoader: ParameterLoader[XMapping]) = new ParameterLoader[FallbackMapping] {
  override def load(mapping: FallbackMapping): List[Param] =
    mapping.mappings.flatMap { 
      case xm: XMapping = xpLoader.load(xm)
      case fm: FallbackMapping => this.load(fm)
    }
  }
于 2016-05-23T19:23:51.207 に答える