2

在研究 shapeless 和 spray 库时,我看到了许多内部 Aux 类型、特征、对象和类。不难理解,它用于扩充现有的内部 API,它看起来很像工厂和辅助方法的“伴侣对象模式”。来自HList来源的示例:

trait Length[-L <: HList] {
  type Out <: Nat
  def apply() : Out
}

trait LengthAux[-L <: HList, N <: Nat] {
  def apply() : N
}

object Length {
  implicit def length[L <: HList, N <: Nat](implicit length : LengthAux[L, N]) = new Length[L] {
    type Out = N
    def apply() = length()
  }
}

object LengthAux {
  import Nat._

  implicit def hnilLength = new LengthAux[HNil, _0] {
    def apply() = _0
  }

  implicit def hlistLength[H, T <: HList, N <: Nat](implicit lt : LengthAux[T, N], sn : Succ[N]) = new LengthAux[H :: T, Succ[N]] {
    def apply() = sn
  }
}
4

1 回答 1

0

例如LengthLength特征是我们希望最终得到的形状,因为它方便地将长度编码为成员,但这不是进行隐式搜索的方便形式。因此引入了一个“Aux”类,它接受Out在特征中命名的结果参数,并将其添加到asLength的类型参数中,即长度。一旦这个结果参数被编码为特征的实际类型,我们就可以在隐式范围内搜索特征,知道如果我们找到任何我们正在搜索的,这个类型将具有正确的长度作为 N 参数。LengthAuxNLengthAuxL

于 2013-06-06T13:15:06.490 回答