3

誰がどのようにfoldl機能するか説明できますか? たとえば、 (1 - (2 - (3 - 0))) を生成するのに対し、(((0 - 1) - 2) - 3) を生成する
ことを理解しましたが、まだいくつか質問があります。 foldr (-) 0 [1,2,3]foldl (-) 0 [1,2,3]

  • 1 番目の例 (foldr/foldl を使用したリストの長さ):
    foldr (\_ acc -> acc + 1) 0 [1,2,3,4,5]予想どおり、5 が生成されます。
    foldl (\_ acc -> acc + 1) 0 [1,2,3,4,5]6 を生成します。:|
    foldl (\_ acc -> acc + 1) 0 [2]3 を生成します。:|
    foldl はこれらの例にどのように反応しますか?

  • 2 番目の例:
    foldr (:) [] [1,2,3,4][1,2,3,4] を生成 - 心配はいりませんが、エラーが 表示さfoldl (:) [] [1,2,3,4]れます:Occurs check: cannot construct the infinite type: a ~ [a]

4

1 に答える 1

4

ではfoldr、アキュムレータは折り畳む関数の 2 番目の引数ですが、foldlでは、アキュムレータは最初の引数です。質問の導入段落を注意深く見ると、これを自分で解決できます...

「最初の例」のコードは誤解を招く可能性があります。これは、acc引数 (その名前はアキュムレータであることを示しています) が一貫してラムダの 2 番目の引数であるためfoldlです。サンプルリスト要素の型と値はアキュムレータ値の型と値を反映しているため、さらに混乱します...コメントが言及しているように、他の値を使用する方が良いでしょう。他の型を使用する方が良いでしょう!

「2番目の例」では、引数が交換されているため、型エラーが発生します(また、要素がそれ自体のリストであるリストを持つことはできません)。引数の順序を手動で入れ替えます。

foldl (\xs x -> x:xs)

またはflip、このために設計されたライブラリ関数を使用します。

foldl (flip (:))

ケースの結果は逆foldlのリスト (コピーされたリストではなく) になることに注意してください。foldlfoldr

于 2016-06-06T17:42:32.143 に答える