探索无形的“最后”类型

时间:2017-01-15 22:03:43

标签: scala shapeless

我或多或少地输入了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)
    }
}

如何修复此编译时错误?

1 个答案:

答案 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没有实现,那么在这种情况下会更有帮助。