【问题标题】:Pattern behind shapeless Aux classes无形 Aux 类背后的模式
【发布时间】:2013-06-06 22:03:05
【问题描述】:

在研究 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
  }
}

【问题讨论】:

    标签: api scala shapeless


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2017-09-29
    • 2021-05-02
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多