2013-08-25 53 views
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遍历列表。我希望能够使用存在的任何Iterator函数(折叠,过滤器等),而不会在“空迭代器”异常处得到“下一个”。

您可以在F#中使用seq和yield来做到这一点。我希望Iterator.continually会一样健壮。

F#例如:

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

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

+0

您是否已经知道[Streams](http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream)? – DaoWen

+0

这个问题对我来说根本不清楚。你可以在'input'上调用'map'来完成该操作('input.map(x => x + x)'),但是这似乎并不能解决你的用例,只是你的例子。但是,我不知道你的用例是什么。 –

+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) 
+0

我以为你不能在scala中使用这种产量吗? :(grrr –

+0

'for''yield'语法是'map'和'flatMap'的糖。'(i < - input)yield i + i'等价于'input.map(i => i +我)'。 –