1. ホーム
  2. haskell

[解決済み] foldrはどのように機能するのですか?

2023-04-26 14:10:10

質問

どなたか foldr はどのように機能するのでしょうか?

これらの例を見てみましょう。

Prelude> foldr (-) 54 [10, 11]
53
Prelude> foldr (\x y -> (x+y)/2) 54 [12, 4, 10, 6]
12.0

これらの実行に戸惑っています。何か提案はありますか?

どのように解決するのですか?

foldr はリストの右端から始まり、与えられた関数を使って各リストのエントリとアキュムレータの値を結合します。 結果は、すべてのリスト要素で "fold"した後のアキュムレータの最終的な値です。 その型は

foldr :: (a -> b -> b) -> b -> [a] -> b

となっており、ここからリスト要素(型は a 型) が与えられた関数の最初の引数で、アキュムレータ (型は b 型)は第2引数である。

最初の例では

Starting accumulator = 54
11 -   54  = -43
10 - (-43) =  53

        ^  Result from the previous line

 ^ Next list item

で、出た答えが53。

2つ目の例です。

Starting accumulator = 54
(6  + 54) / 2 = 30
(10 + 30) / 2 = 20
(4  + 20) / 2 = 12
(12 + 12) / 2 = 12

ということで、結果は12です。

編集:追記するつもりでしたが、これは有限のリストに対するものです。 foldr は無限リストでも動作しますが、まず有限のケースを理解するのが一番だと思います。