3

私は弱い頭の通常の形と配列についてたくさん読んだ。しかし、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弱頭正規形にのみ評価されます
  • の最初の引数の評価は、seq2 番目の引数が WHNF に評価される場合にのみ発生します。

では、上記が正しければ (そうですか?)、なぜfoldl'のようにオーバーフローしないのfoldlでしょうか?

一歩減らすとこうなるじゃないですか。

foldl' (+) 0 (1:xs) = let a' = (+) 0 1 in a' `seq` foldl' (+) a' xs

上記では、実行する必要がある関数適用があるため、の 2 番目の引数はseqWHNF にありません。seq2 番目の引数の WHNF に到達する前に、hereの最初の引数を評価することが保証されていますか?

4

1 に答える 1