8

私はいくつかの Haskell 関数をいじっていますが、理解できるものもあれば、理解できないものもあります。

たとえば、そうする場合:scanl (+) 0 [1..3]私の理解は次のとおりです。

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

リストを作成すると、 が得られ[0, 1, 3, 6]ます。

しかし、私はどのように私に与えるのか理解できないようscanr (+) 0 [1..3]です:[6,5,3,0] 多分scanr次のように動作しますか?

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...

それがパターンかどうかはわかりません。

4

2 に答える 2

10

scanrは ですfoldrscanlですfoldlです foldr右から動作します:

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

中間結果をscanr順番に表示するだけです: [6,5,3,0]. 次のように定義できます。

scanr (+) z xs = foldr g [z] xs
  where
  g x ys@(y:_) = x+y : ys

scanlただし、次のように動作する必要があります

scanl (+) 0 [1,2,3] =
  0 : scanl (+) (0+1) [2,3] =
  0 : 1 : scanl (+) (1+2) [3] =
  0 : 1 : 3 : scanl (+) (3+3) [] =
  0 : 1 : 3 : [6]

そうでなければならない

scanl (+) z xs = foldr f h xs z
   where h      z = [z]
         f x ys z = z : ys (z + x)
于 2013-07-30T14:08:50.237 に答える