scala - 在Scala中从初始对象和生成下一个对象的函数创建O(1)内存可迭代

标签 scala iterator scala-2.8 iterable

我想要一种便捷的方式来生成Iterable,给定一个初始对象和一个从当前对象产生下一个对象的函数,该函数消耗O(1)内存(即,它不缓存旧结果;如果要迭代)第二次,必须再次应用该功能)。

似乎没有库对此提供支持。在Scala 2.8中,方法scala.collection.Iterable.iterate具有签名

def iterate [A] (start: A, len: Int)(f: (A) ⇒ A) : Iterable[A]

因此,它要求您提前指定感兴趣的迭代函数应用程序数量,而我对文档的理解是Iterable.iterate实际上会立即计算所有这些值。另一方面,方法scala.collection.Iterator.iterate具有签名
def iterate [T] (start: T)(f: (T) ⇒ T) : Iterator[T]

看起来不错,但我们只得到了Iterator,它并没有提供mapfilter和 friend 的所有便利。

Is there a convenient library method to produce what I want?



如果不,

Can someone suggest the 'colloquial' Scala code for doing this?



总而言之,给定一个初始对象a: A和一个函数f: A => A,我想要一个TraversableLike(例如,可能是一个Iterable)来生成a, f(a), f(f(a)), ...,并使用O(1)内存,以及mapfilter等函数,这些函数还返回一些内容就是内存中的O(1)。

最佳答案

带有过滤器的Iterator.iterate演示:

object I {
  def main(args:Array[String]) {
    val mb = 1024 * 1024
    val gen = Iterator.iterate(new Array[Int](10 * mb)){arr => 
      val res = new Array[Int](10 * mb)
      arr.copyToArray(res)
      println("allocated 10mb")
      res(0) = arr(0) + 1 // store iteration count in first elem of new array
      res
    }
    // take 1 out of 100
    val gen2 = gen filter (arr => arr(0) % 100 == 0) 
    // print first 10 filtered
    gen2.take(10).foreach { arr => println("filtered " + arr(0)) } 
  }
}

(这可能在REPL中不起作用,因为PRINT步骤可能会导致内存管理困惑)
JAVA_OPTS="-Xmx128m" scala -cp classes I将显示过滤有效并且是惰性的。如果未在恒定内存中完成操作,将导致堆错误(因为它分配的内存为900 * 10mb)。

使用JAVA_OPTS="-Xmx128m -verbose:gc" scala -cp classes I查看垃圾回收事件。

关于scala - 在Scala中从初始对象和生成下一个对象的函数创建O(1)内存可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3784075/

相关文章:

scala - 如何形成 scala SortedMaps 的联合?

scala - 嵌套 CPS "reset"

scala - 无法识别的选项 : -Xcext. enabled=true 错误 JVM、JRuby、Scala 和 RubyMine

scala - 与在本地加入大文本文件有关的性能问题

jsp - 如何使用 JSTL <c :forEach> with Struts2 <s:url>?

c - Berkeley DB 中的函数指针迭代器

java - 遍历二叉搜索树以找到所有叶子

scala - Scala-将Int隐式转换为数值[Int]

scala - 在 Scala 中使用幻像类型标记原始类型

scala - 无法弄清楚 = :=[A, B] 代表什么