谁能解释一下这段scala代码的意思

Who can explain the meaning of this scala code

这段代码我看了很久。我把它输入到 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)

谁能一步步解释这个并帮助我理解这里发生了什么。

是的,那是相当厚的东西。

这里令人费解的是,hconsSize 是递归的,实际上并没有自我引用。

applyhconsSize 都引入了类型 Size[X] 的隐式。只有两个隐式可以满足该要求:

  1. hnilSize,但前提是 X 类型为 HNil
  2. hconsSize本身

所以 apply 引入了 hconsSize 隐式,这将 1 添加到堆栈并引入另一个 hconsSize 隐式(不一定按此顺序)。这一直持续到我们遇到 HNil 类型的元素。然后 hnilSize 隐式被拉入,get 为零,展开堆栈并将所有这些 1 相加。

结果:无形 HList 中的元素数。