以下是{无形状的deriveHCons
中LabelledProductTypeClassCompanion
的签名:
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,那么这个签名会不那么强烈吗?
答案 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
,或者只是类型 2
。 2
是其中唯一的居民,例如3: Witness.`2`.T
将无法编译。我们有Witness.`2`.T <: Int
同样的事情适用于符号:尽管Symbol
是最终的,但它的值,特别是文字值,可以给出更精确的类型,与这些值对应的类型:
val s = Symbol("s")
val refined: Witness.`'s`.T = Symbol("s")