2013-08-25 4 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. Я хотел бы иметь возможность использовать любую итераторную функцию, которая существует (fold, filter, etc ...), не получая исключение «next on empty iterator».

Вы можете сделать это в F #, используя seq и yield. Я надеялся, что Iterator.continually будет таким же надежным.

F # пример:

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

P.S. Я понимаю, что могу просто составить кучу функций, а затем передать их функции Iterator, но я пытаюсь создать итераторы таким образом, чтобы я мог в F #.

+0

Вы уже знаете о [Streams] (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream)? – DaoWen

+0

Вопрос мне не совсем понятен. Вы могли бы просто называть 'map' на' input' для выполнения этого ('input.map (x => x + x)'), но, похоже, это не решит ваш вариант использования, просто ваш пример. Однако я понятия не имею, каков ваш вариант использования. –

+0

Я не знаю о потоках, они лучше для такого рода проблем? –

ответ

3

0 думаю, 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'.' for (i <- input) yield i + i' эквивалентен 'input.map (i => i + я) '. –

Смежные вопросы