2017-08-02 2 views
3

私は なしタイプは

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

この優先度キューは、他の一方で、初期状態を設定するには、そのパラメータを使用する関数内に作成されTreeNodeWithCostAndHeuristic

と呼ばれるケースクラスを注文するプライオリティキューを使用しています値は、親と行動は、私が期待タイプ TreeNodeWithCostAndHeuristic[S,A]と私は TreeNodeWithCostAndHeuristic[S,Nothing]をエンキューしようとしている1の間のミスマッチを取得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) 

保持する必要があります。

私の知る限り、何もOptionのサブタイプではありません。私のケースでは、parentとactionの両方がオプションです。なぜ私は不一致を得ていますか?

答えて

2

これは、Scalaコンパイラがタイプを推論する方法に関連しています。短い答えは、単にあなたのケースクラスを構築する際に、明示的に型を宣言することによって、少しそれを支援することです:

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

それはそのサブクラスではないのでTreeNodeWithCostAndHeuristic[S, Nothing]TreeNodeWithCostAndHeuristic[S, A]の代用として有効と考えられているされていない理由。 Foo[A]の型がAの型で共変型である場合は、Foo[S] <: Foo[A]のいずれかのSAの場合)の次のもののみが保持されます。 sloucs答えに加えて

1

、あなたもコンパイラを助けるためにtype ascriptionを使用することができます。

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) 
+0

私はむしろ 'Option.empty'を使用したい - ここでは型帰属よりも少し立派に見えます:'アクションは= Option.empty [A] ' – Dima

+0

@Dimaあなたは正しいかもしれませんが、私はどちらがもっと好きなのか分かりません。私は両方を追加します。 –

関連する問題