在`LabelledGeneric`等中使用`String`而不是`Symbol`

时间:2018-05-25 09:58:47

标签: scala shapeless

型号宇航员无形指南(脚注4)所示,以及  Gitter April 5, 2018 3:35 PM,未来的无形版本可能会将KeyTag(因此FieldType)的关键约束从Symbol更改为String

因此,我尝试使用字符串文字(在typelevel scala编译器中支持,以及最近的带有-Yliteral-types标志的2.12版本)作为我的字段中的密钥类型,以便将来验证我的代码。

但是,目前,所有使用标签的类型类,特别是LabelledGeneric都返回带有Symbols的FieldTypes作为键。例如:

scala> import shapeless._
import shapeless._

scala> case class Foo(bar : Int)
defined class Foo

scala> LabelledGeneric[Foo]
res0: shapeless.LabelledGeneric[Foo]{type Repr = Int with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("bar")],Int] :: shapeless.HNil} = shapeless.LabelledGeneric$$anon$1@56635171
                                                                                !!! ^^^^^^ !!!

所以我正在尝试编写一个在LabelledGenerix.Aux.ReprFieldType[S <: Symbol,_]之间转换FieldType[S <: String,_]的实例,希望在将来的版本中,当库宏/类型类更新为返回String s,我将能够简单地删除它。尽管如此,我仍在努力实现这一目标。从本质上讲,这归结为实施

      def syFldToStrFld[St <: String, Sy <: Symbol, T](syFld : FieldType[Sy,T])(implicit syWit : Witness.Aux[Sy]) : FieldType[St,T] =
        (syWit.value.name : String) ->> (syFld : T)

结果是

[error] : Expression (syWit.value.name: String) does not evaluate to a constant or a stable reference value

有没有办法在编译时解决这个问题?或者是否有任何其他方法可以将String s用作无形状的键并使它们与所有内置库方法互操作,例如LabelledGenericRecord等?

0 个答案:

没有答案