2016-06-08 39 views
6

我正在閱讀這段代碼很長一段時間。我將它輸入到REPL中,它也可以工作。誰能解釋這個scala代碼的含義

但我不知道這裏發生了什麼。爲什麼以及這是如何工作的!

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) 

有人能解釋這一步一步,並幫助我瞭解這裏發生了什麼。

回答

7

是的,這是相當厚的東西。

這裏介意的是hconsSize是遞歸的,沒有真正的自我指涉。

applyhconsSize拉入隱含類型Size[X]。只有兩個implicits可能適合該法案:

  1. hnilSize,但只有當X是類型HNil
  2. hconsSize本身

所以apply拉在hconsSize隱含的,其中加1並且隱含另一個hconsSize(不一定按此順序)。這繼續下去,直到我們遇到類型爲HNil的元素。然後隱含的hnilSize被拉入,get爲零,堆棧被展開並且所有這些1被加起來。

結果:無形HList中的元素數量。