2015-02-09 62 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

相关问题