我或多或少地输入了Last
shapeless
Last
的{{1}}类型类:
import shapeless.{HList, HNil, ::}
trait Last[H <: HList] {
type Out
def last(in: H): Out
}
然后,我按照我的理解键入了Last
的{{1}}的类实例:
HList
但是,我不明白为什么它无法编译:
object Last {
type Aux[L <: HList, O] = Last[L] { type Out = O }
// arrived at the truly `last` item, i.e. `H`
implicit def singleLast[H]: Aux[H :: HNil, H] = new Last[H :: HNil] {
override type Out = H
override def last(in: H :: HNil): H = in.head
}
// I believe this is the inductive step
implicit def hlistLast[H, T <: HList, OutT]
(implicit lt : Last.Aux[T, OutT]): Aux[H :: T, OutT] =
new Last[H :: T] {
type Out = OutT
def apply(l : H :: T): Out = lt(l.tail)
}
}
如何修复此编译时错误?
答案 0 :(得分:3)
Last
的实际无形实现如下:
trait Last[H <: HList] {
type Out
def apply(in: H): Out
}
您已将apply
更改为last
,但在hlistLast
中您仍在尝试使用apply
(通过在lt
上定义并使用它) :
def apply(l : H :: T): Out = lt(l.tail)
编译器错误来自尝试使用lt.apply
时不存在。如果编译器首先告诉你last
没有实现,那么在这种情况下会更有帮助。