【问题标题】:Why does the signature of deriveHCons declare `HK <: Symbol` when Symbol is a final class为什么当 Symbol 是 final 类时,deriveHCons 的签名声明`HK <:Symbol`
【发布时间】:2015-02-09 23:51:01
【问题描述】:

这是Shapeless的LabelledProductTypeClassCompanionderiveHCons的签名:

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 必须从Symbol 派生,这对我来说似乎很奇怪。除了Symbol,还有什么可以替代类型参数HK?如果HK总是Symbol,那么这个签名如果去掉HK,直接在类型签名中替换Symbol,就不会那么霸道了吗?

【问题讨论】:

  • 嗯...你知道Shapeless的目的是什么...基于类型的泛型编程实现了Scala通常无法实现的事情。--github.com/milessabin/shapeless/wiki/…
  • @SarveshKumarSingh 感谢指点!仍然不确定我是否完全了解这一切是如何运作的,但我有一个更好的理解起点。

标签: scala generics subclassing generic-programming shapeless


【解决方案1】:

我将解释为什么这适用于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 &lt;: Int

同样的事情适用于符号:虽然Symbol 是最终的,但它的值,尤其是字面值,可以被赋予更精细的类型,对应于这些值的类型:

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

【讨论】:

  • 代码sn-ps需要导入syntax.singleton._ 才能编译。
猜你喜欢
  • 1970-01-01
  • 2018-09-26
  • 2021-05-23
  • 2023-03-09
  • 2011-09-18
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多