私はこれについてたくさん疑問に思っていましたが、私はそれについて何も見つけることができませんでした。
seq
関数を使用する場合、どのように機能しますか本当に機能しますか?どこでも、seq a b
はa
を評価し、結果を破棄してb
を返します。
しかし、それはどういう意味ですか本当にはどういう意味ですか?次の結果は厳密な評価になりますか?
foo s t = seq q (bar q t) where
q = s*t
つまり、q
はbar
で使用される前に厳密に評価されますか?そして、以下は同等でしょうか:
foo s t = seq (s*t) (bar (s*t) t)
この関数の機能の詳細を取得するのは少し難しいと思います。
seq
は次のように考えることができます。
seq a b = case a of
_ -> b
これにより、a
がヘッドノーマルフォーム(WHNF)に評価され、次にb
の評価が続行されます。
8月のコメントの後に編集:this case ... of
は strict、GHC Core one であり、常に引数を強制します。