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

拉链在Scala中重复列表

发布时间:2020-12-16 09:11:56 所属栏目:安全 来源:网络整理
导读:这是我以前的 question的后续行动.我可以使用迭代器,折叠,拉链,foreach等来遍历Scala中的列表.现在我想知道拉链最适合使用的情况.假设我需要只读访问,而不需要并发. 你能给出这样一个例子,并解释为什么拉链是最好的选择吗? 解决方法 关于拉链的许多整洁的事
这是我以前的 question的后续行动.我可以使用迭代器,折叠,拉链,foreach等来遍历Scala中的列表.现在我想知道拉链最适合使用的情况.假设我需要只读访问,而不需要并发.

你能给出这样一个例子,并解释为什么拉链是最好的选择吗?

解决方法

关于拉链的许多整洁的事情之一就是他们有一个comonad实例,这使我们能够非常优雅地解决某一类问题.

这是我头顶的一个快速例子.假设我们有一个数字序列,我们想用一个指数移动平均线做一个简单的平滑形式,其中列表中每个位置的新值是当前值和所有其他值的平均值,但是更远的邻居贡献较少.

这不是一件非常艰巨的事情来计算,但如果我们使用拉链和一个科学的cobind,它不是一个单行的太远:

import scalaz._,Scalaz._

val weights = Stream.from(1).map(1.0 / math.pow(2,_))

def sumNeighborWeights(neighbors: Stream[Double]) =
  neighbors.fzipWith(weights)(_ * _).sum

def smooth(data: NonEmptyList[Double]) = data.toZipper.cobind { z =>
  (z.focus + sumNeighborWeights(z.lefts) + sumNeighborWeights(z.rights)) / 3
}

现在如果我们写:

val result = smooth(NonEmptyList[Double](0,1,0)).toList

我们会得到道德上的等同于:

List(1 / 24,1 / 12,1 / 6,1 / 3,1 / 24)

考虑到我们如何定义问题,我们想要什么.

(编辑:李大同)

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

    推荐文章
      热点阅读