这是一个源自AUX模式的问题。
定义这样的特征有什么好处:
trait Unwrap[T[_], R] {
type Out
def apply(tr: T[R]): Out
}
是这个吗?
trait Unwrap[T[_], R, Out] {
def apply(tr: T[R]): Out
}
第二个特征定义消除了使用AUX模式的必要。
谢谢!
答案 0 :(得分:2)
在示例中,使用Aux
模式的原因没有得到很好的定义。问题是当Aux
提供的类型的值未知时出现的,这在大多数情况下意味着派生,更具体地讲是宏/编译时类型派生。
这在Shapeless中广泛使用。
def test[V1, HL](input: V1)(implicit ev: Generic.Aux[V1, HL])`
在编写此代码时,您可能会认为HL
是Aux
的输入类型,但实际上是Generic
宏中的输出,作为{{1 }},例如将输出神奇地“注入”到HL中,因此Aux
计算出的输出类型可通过Generic.Aux
访问到该调用站点之外。
如果您在同一个参数组中有多个隐式变量,则存在一个绕过编译器限制的问题,其中一个隐式变量取决于之前一个隐式变量的HL
宏输出。
从The Scala Bible, New Testament, Gospel of Miles粘贴:
Aux