谁能解释一下这段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
是递归的,实际上并没有自我引用。
apply
和 hconsSize
都引入了类型 Size[X]
的隐式。只有两个隐式可以满足该要求:
hnilSize
,但前提是 X
类型为 HNil
hconsSize
本身
所以 apply
引入了 hconsSize
隐式,这将 1 添加到堆栈并引入另一个 hconsSize
隐式(不一定按此顺序)。这一直持续到我们遇到 HNil
类型的元素。然后 hnilSize
隐式被拉入,get
为零,展开堆栈并将所有这些 1 相加。
结果:无形 HList 中的元素数。
这段代码我看了很久。我把它输入到 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
是递归的,实际上并没有自我引用。
apply
和 hconsSize
都引入了类型 Size[X]
的隐式。只有两个隐式可以满足该要求:
hnilSize
,但前提是X
类型为HNil
hconsSize
本身
所以 apply
引入了 hconsSize
隐式,这将 1 添加到堆栈并引入另一个 hconsSize
隐式(不一定按此顺序)。这一直持续到我们遇到 HNil
类型的元素。然后 hnilSize
隐式被拉入,get
为零,展开堆栈并将所有这些 1 相加。
结果:无形 HList 中的元素数。