2013-07-30 19 views
6

Tôi đã rối tung với một số chức năng của Haskell, một số tôi đã hiểu và một số thì không.Scanr hoạt động như thế nào? Haskell

Ví dụ, nếu chúng ta làm: scanl (+) 0 [1..3] hiểu biết của tôi là như sau:

1. the accumulator is 0     acc   = 0 | 
2. (+) applied to acc and first el  acc = 0 + 1 = 1 | 
3. (+) applied to latest acc and snd el acc = 1 + 2 = 3 | 
4. (+) applied to latest acc and third acc = 3 + 3 = 6 V 

Bây giờ khi chúng ta thực hiện danh sách chúng tôi nhận [0, 1, 3, 6].

Nhưng tôi dường như không hiểu làm cách nào scanr (+) 0 [1..3] cho tôi: [6,5,3,0] Có thể scanr hoạt động theo cách sau?

1. the first element in the list is the sum of all other + acc 
2. the second element is the sum from right to left (<-) of the last 2 elements 
3. the third element is the sum of first 2... 

Tôi không biết đó có phải là mẫu hay không.

Trả lời

6

scanrfoldr những gì scanlfoldl. foldr tác phẩm từ bên phải:

foldr (+) 0 [1,2,3] = 
    (1 + (2 + (3 + 0))) = 
    (1 + (2 + 3)) = 
    (1 + 5) = 
    6 

scanr chỉ cho thấy kết quả tạm thời theo thứ tự: [6,5,3,0].