这个问题源于我的之前的提问:HList#foldLeft()返回什么?
我有一个这样的场景:
class Cursor {
}
trait Column[T] {
def read(c: Cursor, index: Int): T
}
object Columns {
object readColumn extends Poly2 {
implicit def a[A, B <: HList] = at[Column[A], (B, Cursor, Int)] { case (col, (values, cursor, index)) ⇒
(col.read(cursor, index) :: values, cursor, index+1)
}
}
def readColumns[A <: HList, B <: HList](c: Cursor, columns: A)(implicit l: RightFolder.Aux[A, (HNil.type, Cursor, Int), readColumn.type, (B, Cursor, Int)]): B =
columnas.foldRight((HNil, c, 0))(readColumn)._1
}
这段代码试图读取多个列的值。
如果我调用readColumns(cursor, new Column[String] :: new Column[Int] :: HNil)
,我期望得到String :: Int :: HNil
。
readColumns()
方法编译没有问题,但编译器在具体的调用中抱怨隐式参数。
正确的工作方式是什么?
更新1:
以下是我使用2列时收到的确切错误消息:
could not find implicit value for parameter l:
shapeless.ops.hlist.RightFolder.Aux[shapeless.::[Column[String],shapeless.::
[Column[String],shapeless.HNil]],(shapeless.HNil.type, android.database.Cursor, Int),readColumn.type,(B, android.database.Cursor, Int)]
不知道如何帮助编译器。:(
更新2:
问题:为什么在readColumns()
的隐式参数中指定HNil.type
:RightFolder.Aux[A, (HNil.type, Cursor, Int), readColumn.type, (B, Cursor, Int)]
?
readColumns()
的隐式参数指定HNil.type
?对于具体的调用仍然无法正常工作。 :-( - david.perezreadColumns
对我起作用了。我会看一下,但可能要等到今天下午以后才有机会。 - Travis BrownHNil: HNil
中,第一个术语指的是对象 HNil
,而第二个术语指的是特质 HNil
。 - david.perezreadColumns()
隐式参数的问题。Shapeless很强大,但也很棘手。 :-( - david.perez