У меня есть изменчивый код 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 варианта:
- Напишите хвостовую рекурсивную функцию, откусите пулю и выполните рефакторинг кода обработки значения
- Используйте ленивый список. Это не чувствительное к памяти приложение (хотя оно чувствительно к производительности)
- Придумайте новый подход.
Полагаю, я действительно хочу получить лениво оцененную последовательность, в которой я могу отбросить значения после их обработки. Есть предложения?