より機能的なスタイルで書き直そうとしている変更可能なスカラ コードがいくつかあります。これはかなり複雑なコードなので、少しずつリファクタリングしようとしています。私の最初の考えはこれでした:
def iterate(count:Int,d:MyComplexType) = {
//Generate next value n
//Process n causing some side effects
return iterate(count - 1, n)
}
iterate(2000000,initialValue)
コード全体にまだ副作用が混在しているため、これはまったく機能していないように見えました。私の2番目の考えはこれでした:
def generateStream(d:MyComplexType):Stream[MyComplexType] = {
//Generate next value n
return Stream.cons(n, generateStream(n))
}
for (n <- generateStream(initialValue).take(2000000)) {
//process n causing some side effects
}
少なくとも、機能的な値生成コードを変更可能な値処理コードから分離したため、これは私にとってより良い解決策のように思えました。ただし、実際には保存する必要のない大きなリストを生成しているため、これはメモリ効率が大幅に低下します。
これにより、3つの選択肢が残ります。
- 末尾再帰関数を作成し、弾丸をかじって値処理コードをリファクタリングする
- 遅延リストを使用します。これはメモリに敏感なアプリではありません (ただし、パフォーマンスには敏感です)。
- 新しいアプローチを思いつく。
私が本当に欲しいのは、処理後に値を破棄できる遅延評価シーケンスだと思います。助言がありますか?