私はそれが得るseq不要な怠惰を避けることによって、パフォーマンスを向上させるために使用されます。名前の由来を知りたいだけですか?それは「シーケンス」または「シーケンシャル」からですか?そして、その名前はどのように厳格な評価と関係していますか?
私はそれが得るseq不要な怠惰を避けることによって、パフォーマンスを向上させるために使用されます。名前の由来を知りたいだけですか?それは「シーケンス」または「シーケンシャル」からですか?そして、その名前はどのように厳格な評価と関係していますか?
回答:
シーケンスポイントから来ています。これはCでよく知られている概念であり、確かseqにHaskell の演算子と非常によく似ています。左側のすべての計算は、右側のすべての計算の前に行う必要があります。
もちろん、Haskell seqはそれよりも少し要求が少なくなります。それは、左側のものが、右側の結果が評価される前に、弱い頭の標準形に評価されることを要求するだけです。また、特定の評価順序を実際に保証するものではありません†。左側の式がifの場合、右側の式を評価してはならないということだけです。
参照してくださいpseqまたはdeepseq近いCは、シーケンスポイントを呼んでいるものに来る強い代替のために。
† 実際には、CまたはC ++のシーケンスポイントも計算の順序を保証するものではなく、副作用が正しい順序にあることのみを保証します。ただし、Cの副作用はユビキタスであるため、低レベルの最適化は別として、通常、シーケンスポイントの順序が維持されると想定できます。一方、GHCはseq、式が発散しないことを知っている場合に限り、実際にsを捨てます。
aある⊥、その後a `seq` bの結果を返してはいけませんb。
b場合の結果を返すことができます⊥。b何らかの意味で「評価」されない(または見られない)ことを保証していると言うことは誤解を招き、実際には間違っている(そしてとの主な違いだと思いますpseq)。私は「の結果強制的に考えてseq a b、必ずしも力をa、そしてseq a b = b時にa != ⊥」より正確です。
bもしそうなら、結果を返す」ことができます。これは⊥、Haskellでは、実装に言及することなく、少なくとも言うに値することです。のみ、あなたはできなかった、実際に一般的には、これを行う-それは最初に必要になるので、証明bされ⊥、そしてあなたは股関節停止問題を解決する必要があるために。
seq a b = bいつa != ⊥」と言い、次にGHCで実際にどのように機能する傾向があるかを説明するために、「seq a b必然的に力の結果を強制する」と言いaます。
seq a bようになります:「評価bしてからa、次に返すb」。