我已经围绕这个主题提出了一些问题,但这次我想对其进行更一般的讨论,因为在我看来 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
to传递的值val
是相同的,以便它们的内部类型必须一致。这对我来说似乎很自然,因为:
val
是涉及scala中不变性的最基本概念- 需要路径相关的类型兼容性来对
World
具有完全不变性的事物进行建模(从数学角度来看这是非常需要的) - 通过s的流分析
val
解决问题
我要求太多了吗?还是已经有解决它的好方法?