如型号宇航员无形指南(脚注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.Repr
和FieldType[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用作无形状的键并使它们与所有内置库方法互操作,例如LabelledGeneric
,Record
等?