web-dev-qa-db-ja.com

seq関数と厳密さ

私はこれについてたくさん疑問に思っていましたが、私はそれについて何も見つけることができませんでした。

seq関数を使用する場合、どのように機能しますか本当に機能しますか?どこでも、seq a baを評価し、結果を破棄してbを返します。

しかし、それはどういう意味ですか本当にはどういう意味ですか?次の結果は厳密な評価になりますか?

foo s t = seq q (bar q t) where
      q = s*t

つまり、qbarで使用される前に厳密に評価されますか?そして、以下は同等でしょうか:

foo s t = seq (s*t) (bar (s*t) t)

この関数の機能の詳細を取得するのは少し難しいと思います。

42
Undreren

seqは次のように考えることができます。

seq a b = case a of
            _ -> b

これにより、aがヘッドノーマルフォーム(WHNF)に評価され、次にbの評価が続行されます。

8月のコメントの後に編集:this case ... ofstrict、GHC Core one であり、常に引数を強制します。

4
gfour