我正在学习scala,作为一名好学生,我尝试服从我发现的所有规则。
一条规则是:不可抗力!!!
因此,我尝试使用不可变的数据结构和val编写所有代码,有时这确实很难。
但是今天我对自己想:唯一重要的是对象/类不应具有可变状态。我没有被迫以不变的方式编写所有方法的代码,因为这些方法不会相互影响。
我的问题:我是正确的还是没有看到的任何问题/缺点?
编辑:
aishwarya的代码示例:
def logLikelihood(seq: Iterator[T]): Double = {
val sequence = seq.toList
val stateSequence = (0 to order).toList.padTo(sequence.length,order)
val seqPos = sequence.zipWithIndex
def probOfSymbAtPos(symb: T, pos: Int) : Double = {
val state = states(stateSequence(pos))
M.log(state( seqPos.map( _._1 ).slice(0, pos).takeRight(order), symb))
}
val probs = seqPos.map( i => probOfSymbAtPos(i._1,i._2) )
probs.sum
}
说明:这是一种计算可变阶齐次Markov模型的对数似然的方法。状态的apply方法采用所有先前的符号和即将出现的符号,并返回这样做的概率。
如您所见:整个方法只是将一些概率相乘,而使用var则容易得多。
最佳答案
规则不是真正的不变性,而是参照透明性。使用局部声明的可变变量和数组是完全可以的,因为整个程序的任何其他部分都无法观察到任何影响。
引用透明性(RT)的原理是:
如果对所有程序e
而言,p
中的每次e
出现都可以用评估p
的结果替换,而不影响e
的可观察结果,则p
表达式是透明的。
请注意,如果e
创建并更改了某些本地状态,则不会违反RT,因为没有人可以观察到这种情况。
就是说,我非常怀疑使用vars实现会更简单。
关于scala - 掌握不变的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8346119/