【发布时间】:2015-01-25 03:42:20
【问题描述】:
这个问题来源于我之前的问题:What does HList#foldLeft() return?
我有这种情况:
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)]?
【问题讨论】: