我正在阅读这段代码很长一段时间.我把它键入REPL,它也可以.
但我不知道这里发生了什么.为什么以及如何工作!
import shapeless._
case class Size[L <: HList](get : Int)
object Size {
implicit val hnilSize = Size[HNil](0)
implicit def hconsSize[H, T <: HList](implicit tailSize: Size[T]) =
Size[H :: T](1 + tailSize.get)
def apply[L <: HList](l : L)(implicit size: Size[L]) : Int = size.get
}
Size(1 :: "Foo" :: true :: HNil)
Run Code Online (Sandbox Code Playgroud)
有人可以一步一步地解释这一点,并帮助我理解这里发生了什么.
是的,这是非常厚的东西.
这里的心灵弯曲hconsSize是递归的,而不是实际的自我指涉.
无论apply与hconsSize拉隐式类型的Size[X].只有两个含义可以适合该法案:
hnilSize,但仅限于X类型HNilhconsSize 本身因此apply拉入hconsSize隐式,它向堆栈添加1并拉入另一个hconsSize隐式(不一定按此顺序).这一直持续到我们遇到类型的元素HNil.然后hnilSize隐式被拉入,get为零,堆栈被展开并且所有这些都被加起来.
结果:无形HList中的元素数.