gpt4 book ai didi

scala - AUX 模式解决方法

转载 作者:行者123 更新时间:2023-12-04 15:59:02 25 4
gpt4 key购买 nike

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

谢谢!

最佳答案

您使用 Aux 模式的原因在您的示例中没有明确定义。当 Aux 提供的类型的值尚不清楚时就会出现问题,这在大多数情况下意味着派生,更具体地说是宏/编译时类型派生。

这在 Shapeless 中被广泛使用。

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

当你写这个的时候,你可能认为 HLAux 的输入类型,但它实际上是 Generic 宏中的输出,作为消耗品提供给 Aux,例如,输出被神奇地“注入(inject)”到 HL 中,因此可以通过 HL< 访问由 Generic.Aux 计算的输出类型 超出该调用站点。

它的存在是为了规避编译器限制,如果您在同一个参数组中有多个隐式,其中一个隐式取决于前一个的 Aux 宏输出。

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

 * More importantly, Aux allows us to write code like this:
*
* {{{
* def myMethod[T, R]()(implicit eqGen: Generic.Aux[T,R], repEq: Eq[R]) = ???
* }}}
*
* Here, we specify T, and we find a Generic.Aux[T,R] by implicit search. We then use R in the second argument.
* Generic.Aux[T, R] is exactly equivalent to Generic[T] { type Repr = R }, but Scala doesn't allow us to write
* it this way:
*
* {{{
* def myMethod[T, R]()(eqGen: Generic[T] { Repr = R }, reqEq: Eq[egGen.Repr]) = ???
* }}}

关于scala - AUX 模式解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50977833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com