Я экспериментирую с более функциональным стилем в своем JavaScript; поэтому я заменил на циклы служебными функциями, такими как map и reduce. Тем не менее, я не нашел функциональной замены для циклов while, так как оптимизация хвостовых вызовов, как правило, недоступна для JavaScript. (Из того, что я понимаю, ES6 предотвращает переполнение хвостов от стека, но не оптимизирует их производительность.)
Я объясню, что я пробовал ниже, но TL;DR: Если у меня нет оптимизации хвостового вызова, каков функциональный способ реализации в цикле?
Что я пробовал:
Создание функции "while":
function while(func, test, data) {
const newData = func(data);
if(test(newData)) {
return newData;
} else {
return while(func, test, newData);
}
}
Поскольку оптимизация хвостового вызова недоступна, я мог бы переписать это как:
function while(func, test, data) {
let newData = *copy the data somehow*
while(test(newData)) {
newData = func(newData);
}
return newData;
}
Однако на данный момент мне кажется, что я сделал свой код более сложным/запутанным для всех, кто его использует, так как мне приходится настраивать пользовательскую функцию утилиты. Единственное практическое преимущество, которое я вижу, это то, что он заставляет меня сделать цикл чистым; но кажется, что было бы проще просто использовать регулярный цикл while и убедиться, что я держу все в чистоте.
Я также попытался выяснить способ создания функции генератора, которая имитирует эффекты рекурсии/петлирования, а затем перебирает ее с помощью функции утилиты, например find или reduce. Тем не менее, я еще не понял читаемый способ сделать это.
Наконец, замена циклов на функции утилиты делает более очевидным то, что я пытаюсь выполнить (например, делать вещи для каждого элемента, проверять, проходит ли каждый элемент теста и т.д.). Однако мне кажется, что цикл while уже выражает то, что я пытаюсь выполнить (например, итерацию до тех пор, пока мы не найдем простое число, итерацию до тех пор, пока ответ не будет достаточно оптимизирован и т.д.).
Итак, в конце концов, мой общий вопрос: если мне нужен цикл while, я программирую функциональный стиль, и у меня нет доступа к оптимизации хвостового вызова, тогда какая лучшая стратегия.