我正在学习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/

10-08 23:14