为无形的LeftFolder分散隐式扩展

时间:2014-08-13 19:09:17

标签: scala shapeless polymorphic-functions

我尝试解决this problem并希望使用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

0 个答案:

没有答案