Aux模式在Scala中实现了什么?
我有一点Aux模式的感觉(在无形和其他地方使用),其中一个类型成员被提取到一个类型参数,我知道这是一个解决方法,相同的参数列表中的参数不能依赖在彼此 – 但我一般不清楚它用于什么以及它解决了什么问题.
例如,我目前正在试图弄清楚如何保存和使用whitebox宏返回的更具体的类型 – 这是Aux的用例吗? 有简单的描述吗? 解决方法
简单地说,此模式允许您在两个泛型类型参数之间建立关系.
让我们看看无形的’LabelledGeneric类型类,它为您提供了案例类的通用HList表示: trait LabelledGeneric[T] { type Repr } T是输入类型,即LabelledGeneric [MyCaseClass]将为您提供MyCaseClass的HList表示. Repr是输出类型,即与T对应的HList类型. 让我们编写一个采用Generic实例并需要输出类型的另一个参数的方法.例如,我们可以使用Keys来收集标记泛型的字段名称 def fieldNames[T](implicit gen: LabelledGeneric[T],keys: Keys[gen.Repr]): keys.Repr … 除非这不起作用,因为Scala不允许您在此访问gen或键.我们可以有一个具体类型或一个类型变量. 这就是Aux发挥作用的地方:它让我们将gen.Repr“提升”为一个类型变量: object Generic { type Aux[T,Repr0] = Generic[T] { type Repr = Repr0 } } 正如您所看到的,Aux类型为我们提供了从Repr到类型变量的方法,因此我们最终可以定义foo: def foo[T,Repr,K]( implicit gen: LabelledGeneric.Aux[T,Repr],keys: Keys.Aux[Repr,K] ): K … 如果您熟悉Prolog,则可以将Aux作为谓词来读取,以证明两个类型变量之间的关系.在上面的示例中,您可以将其读作“LabelledGeneric证明Repr是标签为T的通用表示,而Keys.Aux证明K是Repr的所有键的列表”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |