厳密性を導入する関数がseqと呼ばれるのはなぜですか?


8

私はseq関数と、なぜ効率性のために厳密さを導入する必要があるのかを理解しています。私が理解していないのは、なぜこのプリミティブが呼び出されるのseqですか(厳密性とは関係ありません)。


4
「評価する前にこれを評価する」のように「シーケンス」から来ていると思います。これが起源である場合、最初の引数が他の引数より先に評価されることを保証しないため、これは非常に誤解を招く名前です。
カイ

回答:


8

TL; DR:ミランダはそれseqをそれと呼びました、それはsequence(おそらく)すでにモナドのためのものであり、短い間($!)知られstrictていたときに導入されました。

ミランダが最初でした

それが呼び出されseq、それが呼ばれたので、seq中にミランダ少なくともによると、以前の言語ビーイングレイジー持つクラス:ハスケルの歴史ポール・ハダック、ジョン・ヒューズ、サイモンペイトンジョーンズとフィリップ・ワドラーによります

seqデータ構造の両方と厳密なコンポーネントは同じ理由ですでにミランダに存在しており(Turner、1985)、seq1980年代初頭以降、遅延プログラムでのスペースリークの修正に実際に使用されていました(Scheevel、1984、Hughes、1983)。

ターナーは1985年の論文厳密なコンポーネントのみを紹介し、seqそれ自体は紹介していないことに注意してください。Schevelの「NORMA Saslマニュアル」は失われているか、少なくともインターネットでは入手できないようです。ヒューズの論文(上記の「ヒューズ、1983」)ではseqどちらも紹介されていません。

どちらにしてもseq、Mirandas標準環境の一部であり、それが呼び出された理由のヒントも含まれていますseq

2つの値に適用された `seq 'は2番目の値を返しますが、最初の値が完全に未定義ではないことを確認します。対話型プログラムでの正しい同期を保証するためなどに必要な場合があります。

正しい同期または配列の uencing。

他の可能な名前

さて、なぜstrictHaskellでそれが単に呼び出されなかったのですか?それともsequence

さて、導入したHaskell 1.3seqも導入Monadしたことがわかりましたsequence :: Monad m => [m a] -> m ()。したがって、sequence名前として使用できませんでした。

これで問題sequenceは解決しました。次に、を見てみましょうstrictstrict1.3 Evaltypeclassを導入して以来、1.3に含まれていました:

seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)

また、Haskell98をそのままカットすることEvalstrictしなかった。代わりに、Evalすべてのタイプに適用され、strict名前がに変更されたため、完全に削除されました($!)


1
注:このトピックにもう少し光を当てた新しい情報源に出くわしたときはいつでも、この回答を最初から何度も書き直しました。また、最新のLaTeX環境で古いHaskellバージョン1.0および1.1を実行しようとすると、正気が失われることに注意してください。幸い、1.0、1.1、1.2は含まれていません。またseq、1.3には適切な.psHTMLリリースが手元にあります。モナドI / Oが祝われた理由を知りたい場合は、古い[Request] -> [Response]ベースのIOモデルを調べてください。古い会議の議事録は別として、クラスで怠惰であることは、おそらくさらに検討するのに最適なリソースです。
ゼータ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.