gpt4 book ai didi

scala - 如何表达更高级类型的类型约束

转载 作者:行者123 更新时间:2023-12-04 08:36:31 26 4
gpt4 key购买 nike

我正在尝试创建一些特征列表,由使用 CRTP 的类型参数化,但无法弄清楚如何表达类型约束。下面是一些说明问题的示例代码:

trait A[X] {
def x: X
}

trait B[Y <: A[Y]] {
def y(i: Int): Y
}

case class C(i: Int) extends A[C] {
def x = C(i)
}

case class D(i: Int) extends A[D] {
def x = D(i)
}

case class E() extends B[C] {
def y(i: Int) = C(i)
}

case class F() extends B[D] {
def y(i: Int) = D(i)
}

object Program extends App {
def emptyList[X[_ <: Z forSome { type Z <: A[Z] } ]]() = collection.mutable.ListBuffer.empty[X[_]]

val myList = emptyList[B]()
myList += E()
myList += F()

println(myList.map(_.y(2).x))
}

所以在这里我试图创建一个符合 B 特性的对象列表。但是,此代码不会编译,并会出现以下错误:

kinds of the type arguments (B) do not conform to the expected kinds of the type parameters (type X). B's type parameters do not match type X's expected parameters: type Y's bounds >: Nothing <: A[Y] are stricter than type _'s declared bounds >: Nothing <: Z forSome { type Z <: A[Z] } val myList = emptyList[B] ()



对我来说似乎是 _ <: Z forSome { type Z <: A[Z] }确实至少和 Y <: A[Y] 一样严格但也许我错过了一些东西。

所以问题是 - emptyList 函数上的约束应该是什么才能正确处理 B?

最佳答案

经过一些试验和错误,我让它工作。注意:编译器告诉我们 A[+X] 和 B[+Y] 中的类型参数必须是协变的。

trait A[+X] {
def x: X
}

trait B[+Y <: A[Y]] {
def y(i: Int): Y
}

case class C(i: Int) extends A[C] {
def x = C(i)
}

case class D(i: Int) extends A[D] {
def x = D(i)
}

case class E() extends B[C] {
def y(i: Int) = C(i)
}

case class F() extends B[D] {
def y(i: Int) = D(i)
}


object Test extends App {
def emptyList[X[Y <: A[Y]]] = collection.mutable.ListBuffer.empty[X[Y forSome {type Y <: A[Y]} ]]

val myList = emptyList[B]
myList += E()
myList += F()

println(myList.map(_.y(2).x))
}

关于scala - 如何表达更高级类型的类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13194149/

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