无形Aux类背后的模式

时间:2013-06-06 10:38:56

标签: api scala shapeless

在研究无形和喷雾库时,我已经看到了许多内部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
  }
}

1 个答案:

答案 0 :(得分:0)

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