前回は foldl と foldr の二人の性格の違いをみました。 今回は彼らの親戚達(scan系、mapAccum系)を紹介しましょう。 foldl は foldl f z [x1,x2,x3,...x_n] が (...(((z `f` x1) `f` x2) `f` x3) `f` ...) `f` x_n となる計算でしたが foldl1 はこれの初期値 z に関する部分がない foldl1 f [x1,x2,x3,...x_n] が (...((x1 `f` x2) `f` x3) `f` ...) `f` x_n となる計算です。リストが1要素だけの場合と空リストの場合はそれぞれ foldl1 f [x1] = x1 foldl1 f [] = error "Prelude.foldl1: empty list" -- エラー となります。 foldl1 を使っている典型的な例