私はこの問題HList
を解決しようとしていて、関数を使用して折り畳みたいと思っていPoly2
ます。
これは自己完結型の MWE です (問題を再現するために、シェイプレス 2.0 の REPL 内にこれをコピーして貼り付けることができます)。
import shapeless._; import shapeless.record._
case class RowParser[T](value: T)
sealed trait ColParser[T, K <: Symbol] { val column: Witness.Aux[K] }
case class Nullable[T, K <: Symbol](column: Witness.Aux[K], parserF: String => RowParser[T]) extends ColParser[T, K]
case class NonNullable[T, K <: Symbol](column: Witness.Aux[K], parserF: String => RowParser[T]) extends ColParser[T, K]
val cols = NonNullable('col1, (_ => RowParser(42))) :: Nullable('col2, (_ => RowParser("foo"))) :: HNil
object toRecord extends Poly2 {
implicit def colParser[C, T, K <: Symbol, LL <: HList](
implicit ev: C <:< ColParser[T,K]
) = at[Tuple2[List[Int], LL], C] {
case ((vals, rec), x) => (vals, field[K](vals.headOption) :: rec)
}
}
cols.foldLeft((List(1,2), HNil))(toRecord)
// expected: Some(1) :: Some(1) :: HNil
次のエラーが表示されます。
エラー: shapeless.ops.hlist.LeftFolder[shapeless.::[NonNullable[Int,this.T],shapeless.::[Nullable[String,this.T],shapeless.HNil]],( List[Int], shapeless.HNil.type),toRecord.type]
オブジェクト LeftFolder のメソッド hnilLeftFolder で開始 cols.foldLeft((List(1,2), HNil))(toRecord)
そのため、明らかにコンパイラは、LeftFolder
foldLeft
ニーズを生成するために複数の暗黙を見つけることができます。
LeftFolder
あいまいさを解消し、実際にを使用する を派生させたいことをコンパイラに明示的に伝える方法がわかりませんtoRecord
。