下面是Shapeless的LabelledProductTypeClassCompanion
中deriveHCons
的签名:
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
是最终类时,我们声明一个必须从 Symbol
派生的类型参数 HK
对我来说似乎很奇怪。除了 Symbol
之外,如何才能替换类型参数 HK
?如果 HK
始终是 Symbol
,那么如果它去掉 HK 并直接在类型签名中替换 Symbol,这个签名会不会那么引人注目,不是吗?
最佳答案
我将解释为什么这适用于 Int
, 但对于 Symbol
实际上是一样的.
Int
final 对吗?这是它的一个实例:
val n = 2
但实际上我们可以给出n
比那更精确的类型。如何?用literal singleton types :
val n: Witness.`2`.T = 2
现在n
类型为 Witness.`2`.T
,又名 2.type
,或者只是输入 2
. 2
是它的唯一居民,例如3: Witness.`2`.T
不会编译。我们有Witness.`2`.T <: Int
同样的事情也适用于符号:虽然Symbol
是最终的,它的值,特别是字面值,可以被赋予更细化的类型,这些类型对应于这些值:
val s = Symbol("s")
val refined: Witness.`'s`.T = Symbol("s")
关于scala - 为什么 deriveHCons 的签名在 Symbol 是最终类时声明 `HK <: Symbol`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28421709/