gpt4 book ai didi

scala - Scala 中的泛型继承

转载 作者:行者123 更新时间:2023-12-04 08:51:47 24 4
gpt4 key购买 nike

我试图在 Scala 中实现 Okasaki 书中的一些结构,并在测试中尝试将实际测试保留在基类中,仅使用子类来提供被测实例。

例如,对不平衡(树)集的测试如下所示:

class UnbalancedSetSpec
extends SetSpec(new UnbalancedSet[Int])
with IntElements

在哪里
abstract class SetSpec[E, S](val set: Set[E, S]) extends Specification with ScalaCheck {

implicit def elements: Arbitrary[E]

// ...

private def setFrom(es: Seq[E]): S = es.foldRight(set.empty)(set.insert)
}

现在有时我想专门化子规范,例如
class RedBlackSetSpec
extends SetSpec(new RedBlackSet[Int])
with IntElements {

"fromOrdList" should {
"be balanced" ! prop { (a: List[Int]) =>
val s = RedBlackSet.fromOrdList(a.sorted)

set.isValid(s) should beTrue
}
}
}

它失败了,因为没有方法 isValidSet[E, S] — 它在 RedBlackSet[E] 中定义.但如果我继续改变 SetSpec[E, S](val set: Set[E, S])SetSpec[E, S, SES <: Set[E, S]](val set: SES) ,这个特殊问题消失了,但代码仍然无法编译:
Error:(7, 11) inferred type arguments [Nothing,Nothing,okasaki.RedBlackSet[Int]] do not conform to class SetSpec's type parameter bounds [E,S,SES <: okasaki.Set[E,S]]
extends SetSpec(new RedBlackSet[Int])
^

Error:(7, 11) inferred type arguments [Nothing,Nothing,okasaki.UnbalancedSet[Int]] do not conform to class SetSpec's type parameter bounds [E,S,SES <: okasaki.Set[E,S]]
extends SetSpec(new UnbalancedSet[Int])
^
RedBlackSet的定义如下:
package okasaki

class RedBlackSet[E](implicit ord: Ordering[E]) extends Set[E, RBTree[E]] {

所以我希望 E推断为 Int而不是 Nothing , 和 SRBTree[Int] ——但这不会发生。
class RedBlackSetSpec
extends SetSpec[Int, RedBlackSet.RBTree[Int], RedBlackSet[Int]](new RedBlackSet[Int])
with IntElements {


class UnbalancedSetSpec
extends SetSpec[Int, BinaryTree[Int], UnbalancedSet[Int]](new UnbalancedSet[Int])
with IntElements

工作正常,但看起来很丑。

我很难理解为什么 ES此处不作推断。任何提示?

最佳答案

这实际上是 Scala 类型推断的一个众所周知的问题:它无法推断 SES “第一”并用它来推断 ES .想到了一种解决方案:

class RedBlackSetSpec(override val set: RedBlackSet[Int]) extends SetSpec(set) with IntElements {
def this() = this(new RedBlackSet[Int])
...
}

如果你做 set 就不那么难看了在 SetSpec摘要 val而不是构造函数参数,但在您不需要专门化的情况下略有权衡。我认为应该有一个更好的,但这应该有效。

关于scala - Scala 中的泛型继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279385/

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