2013-08-25 87 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 +我)'。 –