【发布时间】:2011-02-20 04:20:57
【问题描述】:
我有以下广度优先搜索的代码实现。
trait State{
def successors:Seq[State]
def isSuccess:Boolean = false
def admissableHeuristic:Double
}
def breadthFirstSearch(initial:State):Option[List[State]] = {
val open= new scala.collection.mutable.Queue[List[State]]
val closed = new scala.collection.mutable.HashSet[State]
open.enqueue(initial::Nil)
while (!open.isEmpty){
val path:List[State]=open.dequeue()
if(path.head.isSuccess) return Some(path.reverse)
closed += path.head
for (x <- path.head.successors)
if (!closed.contains(x))
open.enqueue(x::path)
}
return None
}
如果我为我的特定问题定义 State 的子类型
class CannibalsState extends State {
//...
}
使breadthFirstSearch 返回与传递的相同子类型的最佳方法是什么?
假设我对此进行了更改,以便针对我的特定问题有 3 个不同的状态类,并且它们共享一个共同的超类型:
abstract class CannibalsState extends State {
//...
}
class LeftSideOfRiver extends CannibalsState {
//...
}
class InTransit extends CannibalsState {
//...
}
class RightSideOfRiver extends CannibalsState {
//...
}
当breadthFirstSearch 传递LeftSideOfRiver 的实例时,我怎样才能使类型起作用,以便breadthFirstSearch 推断出正确的返回类型是CannibalsState?
这可以用抽象类型成员完成,还是必须用泛型完成?
【问题讨论】:
标签: scala types type-systems