gpt4 book ai didi

scala - 部分应用类型参数

转载 作者:行者123 更新时间:2023-12-03 23:34:32 25 4
gpt4 key购买 nike

我拼命试图解决以下问题:

trait Access[Res[_]] { def access[C]: Res[C] }

trait CList[C1, A] extends Access[CList[_, A]] // ?!

def test[C1, C2, A](c: CList[C1, A]): CList[C2, A] = c.access[C2]

scalac 只是说: "error: illegal cyclic reference involving trait CList" .我怎样才能使这个编译?

最佳答案

您可能对类型 lambda 感兴趣。您在回答中使用的部分应用程序实际上是 implemented in scalaz .
由于代码的可读性往往降低,因此他们开始使用类型 lambdas。有问题的类型可以写成

({type λ[α] = CList[α,A]})#λ

这是通过在参数化类型 λ 上创建类型投影来实现的。在结构类型内部,从而捕获外部类型参数(在本例中为 A )。

您的答案中描述的有关方差的另一个问题可以通过制作 Res 来解决。 Access 中的参数协变。

进行这些更改后,您的代码应如下所示:
trait Access[+Res[_]] { def access[C] : Res[C]}

trait CList[C, +A] extends Access[({type λ[α] = CList[α,A]})#λ]

关于scala - 部分应用类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527684/

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