私はこのトピックに関していくつか質問をしましたが、Scalaにはいくつかの非常に重要なブロックが欠けているように思われるので、今回はもっと一般的な議論にしたいと思います。
次のコード(私の実際のプロジェクトから簡略化されています)を考えてみましょう。
trait World {
type State <: StateIntf
def evolve(s: State): State
def initialState: State
}
class Algorithm(world: World) {
def process(s: world.State) {
val s1 = world.evolve(s)
// ... do something with s and s1
}
}
すべてがとても美しく数学的に見えますが、
object SomeWorld extends World {...}
new Algorithm(SomeWorld).process(SomeWorld.initialState) // incompatible type
確かにあなたは次の方法で行うことができます
trait World {
type State <: StateIntf
var s: State
def evolve: Unit // s = next state
def initialize: Unit // s = initial state
def getState: StateIntf = s
}
しかし、私たちは変更可能な世界に戻ったばかりです。
これは、Scalaにフロー分析がないためだと言われています。それが問題であるなら、Scalaはその部分を手に入れるべきではありませんか?val
から渡される値が同じであることをコンパイラーが認識できることだけが必要なval
ので、それらの内部タイプは一致する必要があります。これは私にはとても自然に思えます:
val
Scalaの不変性を含む最も基本的な概念ですWorld
完全な不変性(数学的な観点から非常に望ましい)などをモデル化するには、パスに依存する型の互換性が必要です。- 通過のフロー分析は
val
問題を解決します
私はあまりにも多くを求めていますか?それとも、それを解決するための良い方法はすでにありますか?