当Symbol是最终类时,为什么deriveHCons的签名声明`HK<:Symbol`

时间:2015-02-09 23:51:01

标签: scala generics subclassing generic-programming shapeless

以下是{无形状的deriveHConsLabelledProductTypeClassCompanion的签名:

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] = ...

我觉得很奇怪,当HK是最终类时,我们声明必须从Symbol派生的类型参数Symbol。除Symbol之外的任何内容如何替换类型参数HK?如果HK总是Symbol,那么如果这个签名摆脱了HK并且直接在类型签名中替换了Symbol,那么这个签名会不那么强烈吗?

1 个答案:

答案 0 :(得分:2)

我将解释为什么这适用于Int,但Symbol实际上是相同的。

Int是最终的权利吗?以下是它的一个实例:

val n = 2

但我们实际上可以给n一个更精确的类型。怎么样?使用literal singleton types

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

现在n的类型为Witness.`2`.T,a.k.a。2.type,或者只是类型 22是其中唯一的居民,例如3: Witness.`2`.T将无法编译。我们有Witness.`2`.T <: Int

同样的事情适用于符号:尽管Symbol是最终的,但它的值,特别是文字值,可以给出更精确的类型,与这些值对应的类型:

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