簡體   English   中英

無優先級隊列標量中的類型

[英]None type in Priority queue scala

我正在使用優先級隊列來命令一個名為TreeNodeWithCostAndHeuristic的案例類

  case class TreeNodeWithCostAndHeuristic[S,A](parent:Option[TreeNodeWithCostAndHeuristic[S,A]],
                                           action: Option[A],
                                           state: S,
                                           cost: Double,
                                           estimatedRemainingCost: Double)

此優先級隊列在函數內創建,該函數使用其參數設置初始狀態,而其他值必須保持為None或0

  def HeuristicGraphSearch[S,A](problem: ProblemWithCostAndHeuristic[S,A]) = {
    val root = TreeNodeWithCostAndHeuristic(parent = None,action=None,state=problem.initialState,cost = 0.0, estimatedRemainingCost = 0.0)
    val frontier : mutable.PriorityQueue[TreeNodeWithCostAndHeuristic[S,A]] = mutable.PriorityQueue.empty[TreeNodeWithCostAndHeuristic[S,A]]
    frontier.enqueue(root)

但是因為父和動作都沒有,我得到了預期類型TreeNodeWithCostAndHeuristic[S,A]與我試圖將TreeNodeWithCostAndHeuristic[S,Nothing]排隊的不匹配。

據我所知,Nothing是Option的子類型,在我的case類中,parent和action都是選項。 為什么我會遇到不匹配?

它與Scala編譯器推斷類型的方式有關。 簡短的回答是通過在構造case類時明確聲明類型來簡單地幫助它:

val root = TreeNodeWithCostAndHeuristic[S, A](parent = None,action=None,state=problem.initialState,cost = 0.0, estimatedRemainingCost = 0.0)

TreeNodeWithCostAndHeuristic[S, Nothing]不被認為是TreeNodeWithCostAndHeuristic[S, A]的有效替代的原因是因為它不是它的子類; 如果是一個,它必須在類型A中是協變的。如果一些Foo[A]在其類型A是協變A ,那么只有以下成立: Foo[S] <: Foo[A]對於任何S是子類的A

除了sloucs回答,您還可以使用類型歸屬來幫助編譯器:

val root = TreeNodeWithCostAndHeuristic(
    parent = None: Option[TreeNodeWithCostAndHeuristic[S, A]],
    action = None: Option[A],
    state = problem.initialState,
    cost = 0.0,
    estimatedRemainingCost = 0.0)

編譯器抱怨的原因是它無法保證None.type Option[TreeNodeWithCostAndHeuristic[S, A]]Option[A] ,因此它“拯救”並推斷出Nothing ,這就是所有類型的底部類型。

@Dima還建議使用Option.empty[A]

val root = TreeNodeWithCostAndHeuristic(
    parent = Option.empty,
    action = Option.empty[A],
    state = problem.initialState,
    cost = 0.0,
    estimatedRemainingCost = 0.0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM