AUX模式的解决方法

时间:2018-06-21 21:45:36

标签: scala

这是一个源自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模式的必要。

谢谢!

1 个答案:

答案 0 :(得分:2)

在示例中,使用Aux模式的原因没有得到很好的定义。问题是当Aux提供的类型的值未知时出现的,这在大多数情况下意味着派生,更具体地讲是宏/编译时类型派生。

这在Shapeless中广泛使用。

def test[V1, HL](input: V1)(implicit ev: Generic.Aux[V1, HL])`

在编写此代码时,您可能会认为HLAux的输入类型,但实际上是Generic宏中的输出,作为{{1 }},例如将输出神奇地“注入”到HL中,因此Aux计算出的输出类型可通过Generic.Aux访问到该调用站点之外。

如果您在同一个参数组中有多个隐式变量,则存在一个绕过编译器限制的问题,其中一个隐式变量取决于之前一个隐式变量的HL宏输出。

The Scala Bible, New Testament, Gospel of Miles粘贴:

Aux