3

当需要积累一些数据时,这是司空见惯的事情。我习惯这样做的方式是将数据块附加到数组中。但这在 scala 中是一种不好的做法,那么我该如何避免呢?

4

3 回答 3

4

好吧,有两种处理累积的通用方法:递归和折叠。让我们看一下每个非常简单的示例,以计算列表值的总和。

def sumRecursively(list: List[Int]): Int = {
  def recurse(list: List[Int], acc: Int): Int =
    if (list.isEmpty) acc
    else recurse(list.tail, acc + list.head)
  recurse(list, 0)
}

def sumFolding(list: List[Int]): Int =
  list.foldLeft(0){ case (acc, n) => acc + n }

对此有很多变体,可以更好地处理一种情况或另一种情况。

于 2012-01-29T20:52:21.397 回答
2

事实上,它不是。您可以使用in scala默认情况下Vector它是包的一部分。scala.collection.immutable这将创建一个不可变集合,每次附加到它时都会返回一个新的(不同的)实例。

更多信息:

http://www.scala-lang.org/docu/files/collections-api/collections_15.html

于 2012-01-29T15:13:52.193 回答
2

对于最常见的用途,“map”和“flatMap”操作用于在功能上生成数据结构。两者都从一个数据结构开始,对其中的每个元素应用一些操作,并返回一个与原始数据结构相同形状的新数据结构。它们的不同之处在于新数据结构的填充方式。这两个是如此常见且如此强大,以至于 Scala 包含了一种特殊的语法,即 for-comprehension 来支持它们。for-comprehension 表面上看起来类似于 Java 风格的 for 循环,但实际上编译为一系列 map 和 flatMap 调用(以及其他一些调用)。

在函数式编程中,通常将您的问题分解为从一种数据结构到另一种数据结构的转换,而不是明确描述构建和销毁数据结构所需的步骤。这需要一些时间来适应,尤其是在弄清楚要开始使用什么数据结构时。一旦你掌握了它,这是一种非常强大的技术,可以清晰、准确地表达大量功能,并且几乎没有 bug 潜入的空间。

还值得注意的是,“map”和“flatMap”实际上都是另一个更强大功能的特例:“fold”。“fold”(出于技术原因同时实现为“foldLeft”和“foldRight”)可用于构建数据结构和分解它们。

于 2012-01-29T16:01:25.557 回答