У меня есть некоторый изменчивый scala-код, который я пытаюсь переписать в более функциональном стиле. Это довольно сложный фрагмент кода, поэтому я пытаюсь реорганизовать его на куски. Моя первая мысль была такая:Лучший функциональный подход
def iterate(count:Int,d:MyComplexType) = {
//Generate next value n
//Process n causing some side effects
return iterate(count - 1, n)
}
iterate(2000000,initialValue)
Это, похоже, не функциональны все для меня, так как я все еще имеют побочные эффекты, смешанные на протяжении всего моего кода. Моя вторая мысль была таково:
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 варианта:
- Написать хвостовую рекурсию функцию, стиснуть зубы и реорганизовать код значения Обрабатывающий
- Используйте ленивый список. Это не приложение, чувствительное к памяти (хотя оно чувствительно к производительности)
- Придумайте новый подход.
Я думаю, что я действительно хочу, это лениво оцененная последовательность, где я могу отбросить значения после того, как я их обработал. Какие-либо предложения?
Является ли d of n функцией d из n-1 или более сложной связью? – sblundy
Да, n может быть вычислено исключительно из d, но результат не является детерминированным, и тот же d не всегда будет давать одно и то же n. – dbyrne