私は弱い頭の通常の形と配列についてたくさん読んだ。しかし、Haskell の評価順序の背後にあるロジックを想像するのはまだ難しい
いつ、どのように使用するかを示す一般的な例ですが、一般的な例がどのように使用されるかはまだわかりません
foldl (+) 0 [1..5000000]
スタック オーバーフローが発生する可能性があります。を使用した別の折り畳み定義seq
はそうではありませんが
foldl' _ a [] = a
foldl' f a (x:xs) = let a' = f a x in a' `seq` foldl' f a' xs
foldl' (+) 0 [0..5000000]
私が読んだ seq の説明から、著者は次のことを明確にするために非常に注意を払っています:
- の最初の引数は
seq
、2 番目の引数の前に評価されるとは限りません - の最初の引数は、
seq
弱頭正規形にのみ評価されます - の最初の引数の評価は、
seq
2 番目の引数が WHNF に評価される場合にのみ発生します。
では、上記が正しければ (そうですか?)、なぜfoldl'
のようにオーバーフローしないのfoldl
でしょうか?
一歩減らすとこうなるじゃないですか。
foldl' (+) 0 (1:xs) = let a' = (+) 0 1 in a' `seq` foldl' (+) a' xs
上記では、実行する必要がある関数適用があるため、の 2 番目の引数はseq
WHNF にありません。seq
2 番目の引数の WHNF に到達する前に、hereの最初の引数を評価することが保証されていますか?