1

私の問題が「XY問題」である可能性があることを認識しているため、ここで私が達成したいことの簡単な要約を示します。私が次のタイプを持っているとしましょう:

trait Provider[T] { def provide: T }

そのタイプから提供されたいくつかの値を1つに結合できるようにしたい(提供されたそれぞれが異なるタイプを持つことができます)。組み合わせはプログラムのさまざまな部分で発生します。タイプ Combiner を定義しましょう (私の問題に shapeless を適用しようとしました):

trait Combiner[Out, Providers <: HList] { 
  def combine(providers: Providers): Out 
}

私は次のことを思いつきました:

class ShapelessCombiner[Out, Providers <: HList, P](implicit
  zero: Out,
  folder: LeftFolder.Aux[Providers, Out, P, Out]
) extends Combiner[Out, Providers] {
  def combine(providers: Providers): Out = folder(folder, zero)
}

折りたたみに使用する関数を指定するために、ヘルパー メソッドを作成しました。

def shapelessCombiner[Out, Providers <: HList](
  fun: Poly
)(implicit
  zero: Out,
  folder: LeftFolder.Aux[Providers, Out, fun.type, Out]
) = new ShapelessCombiner[Out, Providers]

それがうまくいかないことを除いて、すべていいです。次のコードを使用して、テストしようとしていました。

implicit val zero = Json.obj()

//incorrect implementation, but compilation is important here
object poly extends Poly2 {
implicit def caseInt =
    at[Json, Provider[Int]]((j, p) => j deepMerge Json.fromInt(p.provide))
  implicit def caseString =
    at[Json, Provider[String]]((j, p) => j deepMerge Json.fromString(p.provide))
}
def hlistInstance: Provider[Int] :: Provider[String] :: HNil = ???
val directResult = hlistInstance.foldLeft(zero)(poly) //compiles
val combiner = shapelessCombiner[Json, Provider[Int] :: Provider[String] :: HNil](poly)//do not compile, LeftFolder.AUX not found

私の質問は:

a)このコンパイルの問題を解決するにはどうすればよいですか、または

b)最初の問題を解決するための別の/より良い方法はありますか

編集

私のエラーは間違ったインポートが原因であることが判明しました。どういうわけか、hlist.LeftFolder の代わりに tuple.LeftFolder をインポートしました。愚かな間違いです。

4

1 に答える 1