Некоторое время назад я разместил вопрос о StackOverflow, показывающий, что встроенная реализация reduceRight
в JavaScript раздражает. Следовательно, я создал функцию стиля foldr
в стиле Haskell как средство:
function foldr(array, callback, initial) {
var length = array.length;
if (arguments.length < 3) {
if (length > 0) var result = array[--length];
else throw new Error("Reduce of empty array with no initial value");
} else var result = initial;
while (length > 0) {
var index = --length;
result = callback(array[index], result, index, array);
}
return result;
}
Однако я никогда не использовал эту функцию foldr
просто потому, что мне никогда не нужно было перебирать массив справа налево. Это заставило меня задуматься, почему я не использую foldr
в JavaScript столько, сколько я делаю в Haskell, и какие примеры реальных примеров использования foldr
в JavaScript?
Я мог ошибаться, но я считаю, что функция foldr
широко используется в Haskell из-за:
- Lazy Evaluation (foldl является хвостом рекурсивным, так как же foldr работает быстрее, чем foldl?)
- Сплав с коротким вырезом с использованием
foldr
/build
( Правильность слияния коротких фракций:foldr
/build
)
Это объясняет, почему foldr
или reduceRight
широко не используются в JavaScript. Я еще не видел реальное использование foldr
в реальном мире только для его итерации справа налево.
Это подводит меня к двум моим вопросам:
- Каковы некоторые реальные примеры использования
reduceRight
в JavaScript? Возможно, вы использовали его в пакете npm. Было бы здорово, если бы вы могли связать меня с вашим кодом и объяснить, почему вам нужно использоватьreduceRight
вместоreduce
. - Почему
reduceRight
не используется так широко, какreduce
в JavaScript? Я уже предоставил свои два цента по этому вопросу. Я считаю, чтоfoldr
в основном используется только для его лени, поэтомуreduceRight
не очень полезен в JavaScript. Однако я мог ошибаться.
Для первого вопроса я попытался найти примеры реальных примеров использования reduceRight
в JavaScript. Однако я не нашел удовлетворительных ответов. Единственные примеры, которые я нашел, были тривиальными и теоретическими:
когда использовать reduce и reduceRight?
То, что я ищу, является практическим примером. Когда целесообразно использовать reduceRight
в JavaScript вместо reduce
?
По второму вопросу, я понимаю, что это прежде всего мнение, основанное на том, почему это хорошо, если вы не отвечаете на него. Основное внимание в этой статье уделяется первому вопросу, а не второму.