私はScalaを初めて使用します。私が理解していることから、ScalaのyieldはC#のyieldとは異なり、selectに似ています。
ScalaにはC#の歩留まりに似たものがありますか?C#の歩留まりは、イテレータの記述を非常に簡単にするため、優れています。
更新: Scalaで実装できるようにしたいC#の擬似コード例を次に示します。
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
、Javaと同様)。イテレータとして、それは怠惰に評価されました。
更新II:ここでは間違っている可能性がありますが、C#でのyieldの全体的なポイントは、高階関数を作成する必要がないようにすることだと思います。たとえば、シーケンスをトラバースする関数を渡す代わりに、通常のforループを記述したり、///のようなメソッドを使用したりできます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))
。