【发布时间】:2013-01-27 03:58:29
【问题描述】:
我已经围绕这个主题提出了一些问题,但这次我想对其进行更一般的讨论,因为在我看来 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等具有完全不变性的事物进行建模(从数学角度来看这是非常需要的) - 通过
vals的流分析解决问题
我要求太多了吗?还是已经有很好的解决方法了?
【问题讨论】: