についてa `seq` b
それは「a
を評価」ということはありませんが、あなたがb
を評価するために行くときあなたにもa
を評価するように、それは、a
とb
間の依存関係を作成することを考えるための方法。
これは、たとえばa `seq` a
が完全に冗長であることを意味します。a
を評価すると、Haskellにa
を評価するように指示しています。同じ論理では、ただ1つの引数を持つseq a
は、単体でa
を書くこととまったく違うものではありません。
何とかa
と評価されているseq a
を持っているだけで動作しません。問題は、seq a
自体が評価されない可能性のある式であることです。たとえば、ネストされたいくつかのサンクの内部に深く存在する可能性があります。だから、seq a
の式全体を評価するときには、それは関係なくなるでしょう。その時点では、a
を評価するでしょう。
@厳密な折り畳み(foldl'
)での使用方法のRhymoidの例が良いです。私たちの目標は、最終的な結果を評価するとすぐに中間累積値(acc
)が各ステップで完全に評価されるように折り目を書くことです。これは、累積値と再帰呼び出しの間seq
を追加することによって行われます。
foldl' f z (x:xs) =
let z' = f z x in z' `seq` foldl' f z' xs
あなたが最終的な結果にそれらのすべてを接続し、折り目でf
の各アプリケーション間のseq
の長鎖としてこれを可視化することができます。このようにして最終的な式(すなわち、リストを合計することによって得られる数)を評価すると、中間値(つまり、リストを折りたたむときの部分和)が厳密に評価されます。
[非常にフォーマットの悪い] 'foldl''の定義(https://wiki.haskell.org/Seq)を見ると、いくつかのレットバインド変数を厳密に評価したいと思うことがよくありますあなたの 'b'値に入る' a'の中で。 –