2013-11-22 13 views

Trả lời

11

Không cần thiết. Độ nghiêm ngặt của foldl' cho phép nó loại bỏ các khối ngay lập tức khi nó đi qua danh sách đầu vào của nó.

foldl' (+) 0 [1,2,3]   foldl (+) 0    [1,2,3] 
foldl' (+) 1 [2,3]    foldl (+) (0 + 1)   [2,3] 
foldl' (+) 3 [3]    foldl (+) ((0 + 1) + 2)  [3] 
foldl' (+) 6 []    foldl (+) (((0 + 1) + 2) + 3) [] 
6          (((0 + 1) + 2) + 3) 
              ((1 + 2) + 3) 
              (3 + 3) 
              6 

Nhưng khi bạn làm scanl nó tạo ra một danh sách có chứa mỗi một trong những bước

scanl (+) 0 [1,2,3] 
[ 0 
, 0 + 1 
, (0 + 1) + 2 
, ((0 + 1) + 2) + 3 
] 

Và bạn phải đi qua toàn bộ danh sách để xem kết quả cuối cùng cho phép bạn kiểm soát như thế nào thunks buộc . Điều này đẩy kiểm soát đánh giá cho người tiêu dùng của danh sách.

6

Vâng, tôi không chắc chắn nếu scanl' không cần là, nhưng nó có thể là một nhu cầu hiếm hơn nhiều so với foldl', vì bạn thường tiêu thụ là kết quả của scanl phần tử bằng phần tử, và do đó buộc nó khi bạn đi chính xác cách foldl'.

Các vấn đề liên quan