[解決済み] foldrとfoldl(またはfoldl')の意味するところ
2022-04-24 16:55:16
質問
まず最初に。
リアルワールドハスケル
を使うなと書いてあります。
foldl
を使用し、代わりに
foldl'
. だから信用しています。
しかし、どのような場合に使うのか、もやもやしています。
foldr
vs.
foldl'
. 目の前に両者の動作が異なる構造が並べられているのはわかるのですが、私は頭が悪いので、いつ"どちらが良いのか理解できていません。実際、私がこの構文に出会ったのは、Rubyの
inject
とClojureの
reduce
には、quot;left" と "right" のバージョンはないようです。(横の質問: 彼らはどのバージョンを使っているのでしょうか?)
私のような頭でっかちな人間を助けてくれるような洞察があれば、とてもありがたいです。
解決方法は?
の再帰は
foldr f x ys
ここで
ys = [y1,y2,...,yk]
のように見えます。
f y1 (f y2 (... (f yk x) ...))
に対する再帰は
foldl f x ys
は次のようになります。
f (... (f (f x y1) y2) ...) yk
ここでの重要な相違点は、もし
f x y
の値だけを使って計算することができます。
x
であれば
foldr
はリスト全体を検査する必要はありません。例えば
foldr (&&) False (repeat False)
リターン
False
一方
foldl (&&) False (repeat False)
が終了することはありません。(注
repeat False
は無限リストを作成し、すべての要素が
False
.)
一方
foldl'
は末尾再帰的で厳密です。何があってもリスト全体を走査しなければならないことが分かっている場合(例えば、リスト内の数字の合計など)には
foldl'
の方が、よりスペース(とおそらく時間)効率が良い。
foldr
.
関連
-
[解決済み】再帰使用時のOcamlエラーUnbound Value
-
[解決済み] 最後の関数の再帰呼び出しで「scheme application not a procedure」と表示された
-
[解決済み] Fatal error.の解決方法 PHPの「Fatal error: Maximum function nesting level of '100' reached, aborting!
-
[解決済み] Schemeにおける再帰的関数
-
[解決済み] Lispで再帰関数はどのように動作するのですか?
-
[解決済み] 再帰から反復への道
-
[解決済み] 再帰的関数の複雑さの決定(Big O記法)
-
[解決済み】Weak Head Normal Formとは何ですか?
-
[解決済み] foldrとfoldl(またはfoldl')の意味するところ
-
[解決済み] 再帰性はそれ自体が特徴なのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】再帰使用時のOcamlエラーUnbound Value
-
[解決済み] リストを反転させるにはどうしたらいいですか?
-
[解決済み] Fatal error.の解決方法 PHPの「Fatal error: Maximum function nesting level of '100' reached, aborting!
-
[解決済み] Schemeにおける再帰的関数
-
[解決済み] Lispで再帰関数はどのように動作するのですか?
-
[解決済み] 再帰とループの比較
-
[解決済み] 再帰から反復への道
-
[解決済み] 再帰的関数の複雑さの決定(Big O記法)
-
[解決済み] foldrとfoldl(またはfoldl')の意味するところ
-
[解決済み] 再帰性はそれ自体が特徴なのか?