2015-02-09 59 views
3

這裏是deriveHCons在無形的LabelledProductTypeClassCompanion簽名:爲什麼deriveHCons的簽名聲明`HK <:Symbol`當符號是一個final類

implicit def deriveHCons[HK <: Symbol, HV, TKV <: HList] 
    (implicit 
     ch: Lazy[C[HV]], 
     key: Witness.Aux[HK], 
     ct: Lazy[Wrap[TKV] { type V <: HList }] 
    ): Wrap.Aux[FieldType[HK, HV] :: TKV, HV :: ct.value.V] = ... 

我覺得奇怪,我說,我們聲明一個類型當Symbol是最後一類時,參數HK必須來自SymbolSymbol什麼都可以替換類型參數HK?如果HK始終爲Symbol,那麼如果它簽署了HK並且直接替換了簽名中的Symbol,那麼這個簽名就不那麼重要了?

+2

那麼......你知道'Shapeless'的目的是什麼......基於類型的泛型編程實現了Scala通常不可能實現的功能 - https://github.com/milessabin/shapeless/wiki/Feature-overview :-shapeless-2.0.0#singleton-typed-symbols – 2015-02-10 00:10:58

+0

@SarveshKumarSingh Thx爲指針!仍然不確定我是否明白所有這些工作如何,但我有一個獲得更好理解的出發點。 – jedesah 2015-02-10 00:16:58

回答

2

我將解釋爲什麼這適用於Int,但它實際上與Symbol相同。

Int是最後的對吧?下面是它的一個實例:

val n = 2 

但是實際上我們可以給n一個更精確的類型比。怎麼樣?隨着literal singleton types

val n: Witness.`2`.T = 2 

現在n的類型爲Witness.`2`.T,又名2.type,或者只是22是其唯一的居民,例如3: Witness.`2`.T將不會編譯。我們有Witness.`2`.T <: Int

同樣的道理也適用於符號:雖然Symbol是最終的,它的價值,特別是文字的,可給予更精緻的類型,對應於這些值的:

val s = Symbol("s") 
val refined: Witness.`'s`.T = Symbol("s") 
+0

代碼片段需要導入'syntax.singleton._ '進行編譯。 – al3xar 2015-02-10 01:30:52

相關問題