拉链在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) 考虑到我们如何定义问题,我们想要什么. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |