Haskell関数 `seq`はどこから名前を取得しますか?


8

私はそれが得るseq不要な怠惰を避けることによって、パフォーマンスを向上させるために使用されます。名前の由来を知りたいだけですか?それは「シーケンス」または「シーケンシャル」からですか?そして、その名前はどのように厳格な評価と関係していますか?

回答:


9

シーケンスポイントから来ています。これはCでよく知られている概念であり、確かseqにHaskell の演算子と非常によく似ています。左側のすべての計算は、右側のすべての計算の前に行う必要があります

もちろん、Haskell seqはそれよりも少し要求が少なくなります。それは、左側のものが、右側の結果が評価される前に、弱い頭の標準形に評価されることを要求するだけです。また、特定の評価順序を実際に保証するものではありません。左側の式がifの場合、右側の式を評価してはならないということだけです。

参照してくださいpseqまたはdeepseq近いCは、シーケンスポイントを呼んでいるものに来る強い代替のために。


実際には、CまたはC ++のシーケンスポイントも計算の順序を保証するものではなく、副作用が正しい順序にあることのみを保証します。ただし、Cの副作用はユビキタスであるため、低レベルの最適化は別として、通常、シーケンスポイントの順序が維持されると想定できます。一方、GHCはseq、式が発散しないことを知っている場合に限り、実際にsを捨てます。


4
「左の式が⊥なら右の式を評価してはいけない」とは思わない。たとえば、wiki.haskell.org/Seqを参照してください。合法的な実装は次のseq a bようになります:「評価bしてからa、次に返すb」。
oisdk

@oisdkよく、評価について話すことは全く意味がありません-これは定義された概念でさえありません。ポイントがあれば、あるaある⊥、その後a `seq` bの結果を返してはいけませんb
1

「評価する」とは、「弱い頭の正常な形への力」を意味します。また、私はまだあなたの説明が正しくないと思います:だったb場合の結果を返すことができますb何らかの意味で「評価」されない(または見られない)ことを保証していると言うことは誤解を招き、実際には間違っている(そしてとの主な違いだと思いますpseq)。私は「の結果強制的に考えてseq a b、必ずしも力をa、そしてseq a b = b時にa != ⊥」より正確です。
oisdk

@oisdkですが、「強制」はHaskellが知っていることではありません。–はい、理論的には、「bもしそうなら、結果を返す」ことができます。これは、Haskellでは、実装に言及することなく、少なくとも言うに値することです。のみ、あなたはできなかった、実際に一般的には、これを行う-それは最初に必要になるので、証明bされ、そしてあなたは股関節停止問題を解決する必要があるために。
1

1
確かに、「強制」はセマンティクスを説明するために使用できる用語ではありませんが、どちらも「評価」することはできません。私は、あなたが与えた2つの説明に代わるものを提示しようとしています。右の結果が評価される前の弱い頭の正規形」、「左の式がifの場合、右の式が評価されてはならない」、どちらも間違っていると思います。正確に説明すると、「seq a b = bいつa != ⊥」と言い、次にGHCで実際にどのように機能する傾向があるかを説明するために、「seq a b必然的に力の結果を強制する」と言いaます。
oisdk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.