我正在尝试创建一个包含其中的数据结构PriorityQueue
。我已经成功地制作了它的非通用版本。我可以说它有效,因为它解决了我遇到的 AI 问题。
这是它的一个片段:
class ProntoPriorityQueue { //TODO make generic
implicit def orderedNode(node: Node): Ordered[Node] = new Ordered[Node] {
def compare(other: Node) = node.compare(other)
}
val hashSet = new HashSet[Node]
val priorityQueue = new PriorityQueue[Node]()
...
我正在尝试使其通用,但如果我使用此版本,它将停止解决问题:
class PQ[T <% Ordered[T]] {
//[T]()(implicit val ord: T => Ordered[T]) {
//[T]()(implicit val ord: Ordering[T] {
val hashSet = new HashSet[T]
val priorityQueue = new PriorityQueue[T]
...
我也尝试过注释掉的内容而不是使用[T <% Ordered[T]]
这是调用的代码PQ
:
//the following def is commented out while using ProntoPriorityQueue
implicit def orderedNode(node: Node): Ordered[Node] = new Ordered[Node] {
def compare(other: Node) = node.compare(other)
} //I've also tried making this return an Ordering[Node]
val frontier = new PQ[Node] //new ProntoPriorityQueue
//have also tried (not together):
val frontier = new PQ[Node]()(orderedNode)
我也尝试过将隐式 def 移动到Node
对象中(并导入它),但本质上是同样的问题。
我在通用版本中做错了什么?我应该把隐式放在哪里?
解决方案
问题不在于我的隐含定义。问题是隐式排序被在语句Set
中自动生成的 a拾取。for(...) yield(...)
这导致产生的集合仅包含一个状态的问题。