私はそれが得る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
」。