Một thời gian trước, tôi đã đăng câu hỏi trên StackOverflow cho biết rằng native implementation of reduceRight
in JavaScript is annoying. Do đó, tôi tạo ra một hàm Haskell kiểu foldr
như một phương thuốc:Ví dụ thế giới thực về cách sử dụng reduceRight trong JavaScript
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;
}
Tuy nhiên, tôi không bao giờ sử dụng foldr
chức năng này đơn giản chỉ vì tôi không bao giờ cần thiết để lặp qua một mảng từ sang trái phải. Điều này khiến tôi suy nghĩ, tại sao tôi không sử dụng foldr
trong JavaScript nhiều như tôi làm trong Haskell và một số ví dụ thực tế về việc sử dụng foldr
trong JavaScript là gì?
Tôi có thể sai, nhưng tôi tin rằng foldr
chức năng được sử dụng rộng rãi trong Haskell vì:
- Lazy đánh giá (foldl is tail recursive, so how come foldr runs faster than foldl?)
- ngắn cắt hợp sử dụng
foldr
/build
(Correctness of short cut fusion:foldr
/build
)
Điều này sẽ giải thích tại sao foldr
hoặc reduceRight
không được sử dụng rộng rãi trong JavaScript. Tôi chưa thấy việc sử dụng thế giới thực của foldr
chỉ cho thứ tự lặp lại từ phải sang trái của nó.
này mang lại cho tôi hai câu hỏi của tôi:
- một số ví dụ thế giới thực của việc sử dụng
reduceRight
trong JavaScript là gì? Có lẽ bạn đã sử dụng nó trong một gói npm. Sẽ thật tuyệt nếu bạn có thể liên kết tôi với mã của bạn và giải thích lý do bạn cần sử dụngreduceRight
thay vìreduce
. - Tại sao
reduceRight
không được sử dụng rộng rãi nhưreduce
bằng JavaScript? Tôi đã cung cấp hai xu cho vấn đề này. Tôi tin rằngfoldr
chủ yếu chỉ được sử dụng cho sự lười biếng của nó, đó là lý do tại saoreduceRight
không phải là rất hữu ích trong JavaScript. Tuy nhiên, tôi có thể sai.
Đối với câu hỏi đầu tiên, tôi đã cố gắng tìm một số ví dụ thực tế về sử dụng reduceRight
trong JavaScript. Tuy nhiên, tôi không tìm thấy bất kỳ câu trả lời thỏa đáng nào. Các ví dụ duy nhất tôi thấy là tầm thường và lý thuyết:
when to use reduce and reduceRight?
Những gì tôi đang tìm kiếm là một ví dụ thực tế. Khi nào thực tế sử dụng reduceRight
trong JavaScript thay vì reduce
?
Đối với câu hỏi thứ hai, tôi hiểu rằng đó chủ yếu là ý kiến dựa trên đó là lý do tại sao nó không sao nếu bạn không trả lời nó. Trọng tâm chính của bài đăng này là câu hỏi đầu tiên, không phải là câu hỏi thứ hai.
Tôi không nghĩ chức năng 'foldr' trong các lần truyền tải haskell từ phải sang trái? – Sibi
@Sibi Bạn nói đúng. Không thể duyệt qua danh sách từ phải sang trái trong Haskell do cách xác định danh sách (tức là 'dữ liệu [a] = [] | a: [a]'). Hàm 'foldr' trong Haskell chỉ tích lũy kết quả từ phải sang trái. Tuy nhiên, câu hỏi này thực sự không phải là về Haskell. –
Tôi có nghĩa đen không bao giờ sử dụng 'reduceRight' trong mã. Tôi đã sử dụng 'reduce' ít nhất một ngàn lần. –