Я изучаю функциональное программирование на F #, и я хочу написать функцию, которая будет генерировать последовательность для меня.
Существует некоторая предопределенная функция для преобразования значения, и в функции, которую мне нужно написать, должно быть два входа - начальное значение и длина последовательности.Последовательность начинается с начального значения, и каждый следующий элемент является результатом применения функции преобразования к предыдущему значению в последовательности.
В C # я обычно пишу что-то вроде этого:
public static IEnumerable<double> GenerateSequence(double startingValue, int n)
{
double TransformValue(double x) => x * 0.9 + 2;
yield return startingValue;
var returnValue = startingValue;
for (var i = 1; i < n; i++)
{
returnValue = TransformValue(returnValue);
yield return returnValue;
}
}
Когда я попытался перевести эту функцию на F #, я сделал это:
let GenerateSequence startingValue n =
let transformValue x =
x * 0.9 + 2.0
seq {
let rec repeatableFunction value n =
if n = 1 then
transformValue value
else
repeatableFunction (transformValue value) (n-1)
yield startingValue
for i in [1..n-1] do
yield repeatableFunction startingValue i
}
У этой реализации есть две очевидные проблемы.
Во-первых это потому, чтоЯ пытался избежать создания изменяемого значения (аналог переменной returnValue
в реализации C #), я не использовал значения предыдущих вычислений при генерации последовательности.Это означает, что для сотого элемента последовательности мне нужно сделать дополнительно 99 вызовов функции transformValue
вместо одного (как я делал в реализации C #).Это пахнет крайне плохой производительностью.
Секунда заключается в том, что вся функция не написана в соответствии с функциональным программированием.Я уверен, что есть более элегантная и компактная реализация.Я подозреваю, что Seq.fold
или List.fold
или что-то подобное, должно быть использовано здесь, но я все еще не могу понять, как эффективно их использовать.
Так что вопрос: как переписать функцию GenerateSequence
на F #, чтобы она была в стиле функционального программирования и имела лучшую производительность?
Любые другие советы также приветствуются.