8

一般に、またはfoldlを優先して回避します。実世界の Haskellの引用:foldl'foldr

foldl のサンク動作のため、実際のプログラムではこの関数を使用しない方が賢明です。完全に失敗しない場合でも、不必要に非効率になります。代わりに、Data.List をインポートして、foldl' を使用します。

しかし、一部の Prelude 関数はそれに関して定義されています (例:(\\)およびunionBy)。どうしてこれなの?これらの機能を厳密にしすぎないようにするためですか?

4

3 に答える 3

13

Prelude は存在する前に設計されfoldl'ており、それ以来、後方互換性を維持するというプレッシャーがありました (厳密さに関しては、あなたが言及したように)。

于 2012-11-20T14:52:44.780 に答える
10

(\\)との場合unionBy、折り畳まれた関数は型を持ちます

foo :: [a] -> b -> [a]

から最大で 1 つの要素をfoo xs y削除するxsため、 を使用してfoldl'も一般に何も購入されず、サンクはその上ではなく一番上の右側に構築され(:)ます。

厳密さの点で違いはありません。私が見る限り、両方の折り畳みは、結果を弱い頭の正規形に評価する必要がある場合にのみ評価され、 が を生成するときはいつでも評価されfoldl'ます。_|_foldl

于 2012-11-20T15:13:43.690 に答える
4

どちらの場合も、アキュムレータの型は[a]です。リストを弱頭の正規形に強制することで大きな違いが生じるとは思えず、そのような部分的な厳密性を導入することはやや恣意的なように思えます。

于 2012-11-20T15:12:42.077 に答える