Есть ли у Scala эквивалент C # yield?

Я новичок в Scala, и, насколько я понимаю, yield в Scala не похож на yield в C #, он больше похож на select.

Есть ли у Scala что-то похожее на выход C #? Выход C # велик, потому что он делает написание итераторов очень простым.

Обновить: Вот пример псевдокода из C #, который я хотел бы реализовать в Scala:

public class Graph<T> {
   public IEnumerable<T> BreadthFirstIterator() {
      List<T> currentLevel = new List<T>();
      currentLevel.add(_root);

      while ( currentLevel.count > 0 ) {
         List<T> nextLevel = new List<T>();
         foreach( var node in currentLevel ) {
            yield return node;
            nextLevel.addRange( node.Children );
         }
         currentLevel = nextLevel;
      }
   }
}

В этом коде реализован итерационный обход графика в ширину, используя yield, он возвращает итератор, поэтому вызывающие могут проходить по графику с помощью регулярного цикла for, например:

graph.BreadthFirstIterator().foreach( n => Console.WriteLine( n ) );

В C # yield является просто синтаксическим сахаром, облегчающим написание итератора (IEnumerable<T> в .Net, аналогичноIterable на Яве). Как итератор, его оценивают лениво.

Обновление II: Я могу ошибаться, но я думаю, что весь смысл yield в C # заключается в том, что вам не нужно писать функцию более высокого порядка. Например. Вы можете написать регулярный цикл или использовать такой метод, какselect/map/filter/where вместо того, чтобы передавать функцию, которая затем будет проходить последовательность.

Например.graph.iterator().foreach(n => println(n)) вместоgraph.iterator( n => println(n)).

Таким образом, вы можете легко их связать, например,graph.iterator().map(x => x.foo).filter(y => y.bar >= 2).foreach(z => println(z)).

Ответы на вопрос(7)

Ваш ответ на вопрос