2016-04-01 13 views
1

はスカラ座と、次のと混同について学ぶ:Scala xs.foreach(yield _)?

この仮定:これは動作しますval filesHere = (new java.io.File(".")).listFiles

を:for (fn <- filesHere) yield fn

これは動作します:filesHere.foreach(println _)

をこれは動作しません:filesHere.foreach(yield _)

エラーメッセージ:<console>:1: error: illegal start of simple expression

最後の作業と、それを動作させる方法は、なぜforeachを使用していませんか?

+0

ファイルで何をしようとしていますか?あなたが各ファイルに対して同じアクションを実行しようとしているなら、単純な 'map'が良い選択でしょう。 'for(...)yield {...}'構文は一連の 'flatMap'操作の後に最後の' map'( 'yield')が続きます。 詳細は、ドキュメントの[link](http://docs.scala-lang.org/tutorials/FAQ/yield.html)を参照してください。 – Eric

答えて

3

yieldは、forの内包語と組み合わせて使用​​するキーワードです(例:for (fn <- filesHere) yield fn)。これにより、filesHereを反復し、各要素をyield fn経由で返します。

以下は、値resultfn要素の結果として得られる集合を割り当てることになる。

val result = for (fn <- filesHere) yield fn 

for (fn <- filesHere) yield fnfilesHere.map(fn => fn)と等価です。

filesHere.foreach(fn => fn)(すなわち無yieldキーワードfor (fn <- filesHere) fnと同等ないだろうので、何の結果要素は、それがあなたのケースで有益な何かをしないだろうことを意味する、返されない

完全性について:。filesHere.foreach(println _)は、より多くの何かをfilesHere.foreach(fn => println(fn))に相当しますprintln経由で標準出力に印刷すると便利です。

これはちょっと明確です。

関連する問題