加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 掌握不变的数据结构

发布时间:2020-12-16 09:36:05 所属栏目:安全 来源:网络整理
导读:我正在学习斯卡拉,作为一个好学生,我试图遵守我发现的所有规则。 一个规则是:不可执行! 所以我试图用不可变的数据结构和val来代码一切,有时这很难。 但是今天我想到了自己:唯一重要的是对象/类应该没有可变状态。我不会强制以不可变的方式编写所有方法
我正在学习斯卡拉,作为一个好学生,我试图遵守我发现的所有规则。

一个规则是:不可执行!

所以我试图用不可变的数据结构和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
}

说明:它是一种计算可变顺序的均匀马尔科夫模型的对数似然性的方法。应用的状态方法采用所有先前的符号和即将到来的符号,并返回这样做的概率。

正如你所看到的:整个方法只是乘以一些概率,这将更容易使用vars。

解决方法

规则并不是真正的不变性,而是参照透明度。使用本地声明的可变变量和数组是完全可行的,因为没有任何效果可以观察到整个程序的任何其他部分。

参考透明度(RT)的原则是:

表达式e是透明的,如果对于所有程序p,则每个p中的e的每个出现可以用评估e的结果代替,而不影响p的可观察结果。

请注意,如果e创建并突变某些本地状态,则不会违反RT,因为没有人可以观察到这种情况。

也就是说,我非常怀疑您的实现与vars更为直接。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读