编写迭代器

时间:2013-08-25 22:17:39

标签: scala

说我有以下功能定义:

def print(input:Iterator[String]) : Iterator[String] = {
  Iterator.continually {
     val item = input.next
     item + item
  }
}

给出输入

List("1", "2", "3").iterator

我希望输出等于

List("11", "22", "33").iterator

问题在于,当我使用Iterator.continually时,我被迫使用takeWhile遍历列表。我希望能够使用任何存在的Iterator函数(折叠,过滤等等),而不会获得“下一个空迭代器”异常。

您可以使用seq和yield在F#中执行此操作。我希望Iterator.continually同样强大。

F#示例:

seq {
   for i in input |> yield i + i
}

P.S。我意识到我可以编写一堆函数,然后将它们传递给Iterator函数,但我试图用F#中的方式编写迭代器。

1 个答案:

答案 0 :(得分:3)

我认为List.map会做你想要的。但是,您可能希望将Scala用于理解语法,编译器只将其转换为map调用。这是我的REPL测试中的一个片段。似乎工作。

scala> def print(input:Iterator[String]) : Iterator[String] =
     |   for (i <- input) yield i + i
print: (input: Iterator[String])Iterator[String]

scala> print( List("a", "b", "c").iterator )
res0: Iterator[String] = non-empty iterator

scala> res0.toList
res1: List[String] = List(aa, bb, cc)