1

假设我有以下函数定义:

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. 我希望能够使用任何存在的迭代器函数(折叠、过滤器等),而不会出现“空迭代器上的下一个”异常。

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

F# 示例:

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

PS我意识到我可以组合一堆函数,然后将它们传递给一个迭代器函数,但我试图以一种我可以在 F# 中的方式组合迭代器。

4

1 回答 1

3

我想List.map会做你想做的。但是,您可能希望使用 Scala 的 for comprehension 语法,编译器只是将其转换为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)
于 2013-08-25T22:37:12.597 回答