SCALA:折り畳みのパラメーターを入力するためにキャストを回避します

StackOverflow https://stackoverflow.com/questions/8383694

  •  28-10-2019
  •  | 
  •  

質問

ユーザーが派生したタイプで実装すると予想されるシミュレーションの状態の特性を定義するこのスニペットを考慮してください。特性については、ユーティリティ方法のコレクションは、SCALAライブラリコレクションがこれを行う方法と同様に、実装のタイプを持つ結果を提供できるはずです。それを達成するには、このような実装タイプで特性をパラメーター化する必要があると思います。

trait State[+This <: State[This]] {
   def update : This  // result has type of State's implementor
}

次に、このようなマルチステップ更新方法を定義したいと思います。

def update(steps: Int) : This 

素朴なアプローチを試してみると:

def update(steps: Int) : This = 
    (this /: (0 until steps))( (s,n) => s.update )

コンパイラは、タイプの不一致について不満を述べています。

 error: type mismatch;
 found: State[This]
 required: This

それ以来、それは理にかなっています this, 、状態内で見られる、タイプ状態[これ]があります。コードをコンパイルするには、明示的なキャストをしなければならないようです。

def update(steps: Int) : This = 
    (this.asInstanceOf[This] /: (0 until steps))( (s,n) => s.update )

この明示的なキャストを回避する方法はありますか、それともより一般的にはより良い方法で意図した結果を達成する方法はありますか?ありがとう。

役に立ちましたか?

解決

あなたはそれを確実にするために自己タイプの注釈を追加する必要があります State aです This:

trait State[+This <: State[This]] { this: This =>
  def update: This  // result has type of State's implementor
}

再定義する可能性のある方法 update(Int) 折り目のない方法は次のとおりです。

def update(steps: Int): This = Iterator.iterate(this)(_.update).drop(steps).next
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top