私は Scala を初めて使用し、機能的な方法で使用しようとしています。ここに私の質問があります:
「<-」演算子を使用して、関数の戻り値を持つ「cnt」変数の新しいバインディングを作成できないのはなぜですか?
機能的な方法で不変変数をインクリメントするにはどうすればよいですか (Haskell <-) に似ていますか? 実験のために、可変変数を使用したくありません。
import scala.io.Source object MyProgram { def main(args: Array[String]): Unit = { if (args.length > 0) { val lines = Source.fromFile(args(0)).getLines() val cnt = 0 for (line <- lines) { cnt <- readLines(line, cnt) } Console.err.println("cnt = "+cnt) } } def readLines(line: String, cnt:Int):Int = { println(line.length + " " + line) val newCnt = cnt + 1 return (newCnt) } }
副作用に関しては、 (line <- lines) がこれほど破壊的であるとは予想できませんでした! 行イテレータを完全に巻き戻します。したがって、次のスニペットを実行すると size = 0 になります。
val lines = Source.fromFile(args(0)).getLines()
var cnt = 0
for (line <- lines) {
cnt = readLines(line, cnt)
}
val size = lines.size
このようなよく隠された副作用を持つことは、通常の Scala の慣行ですか?