Haskellには、、、 についての良い質問と回答がたくさんあります。foldl
foldr
foldl'
だから今私は知っています:
1)foldl
怠惰です
2)foldl
スタックを爆破する可能性があるので使用しないでください
3)foldl'
厳密なので代わりに使用してください(ish)
評価方法foldl
:
1)大量のサンクが作成されます
2)Haskellがサンクの作成を完了した後、サンクが削減され
ます3)サンクが多すぎる場合はスタックがオーバーフローします
私が混乱していること:
1)なぜすべてのサンクの後に削減が発生しなければならないのですか?
2)なぜfoldl
同じように評価されないのfoldl'
ですか?これは単なる実装の副作用ですか?
3)定義から、末尾再帰を使用して効率的に評価できるようにfoldl
見えます-関数が実際に効率的に評価されるかどうかをどのように判断できますか?プログラムをクラッシュさせたくないのであれば、Haskellでの評価の順序について心配し始めなければならないようです。
前もって感謝します。の評価についての私の理解が正しいかどうかはわかりませんfoldl
。必要に応じて修正を提案してください。
更新:私の質問への答えは、正規形、弱い正規形、および頭の正規形、およびそれらのHaskellの実装と関係があるようです。
ただし、結合関数をより熱心に評価すると、別の結果(クラッシュまたは不要な評価)が発生する例をまだ探しています。