[解決済み] Haskellのストリクトネスポイントは何ですか?
質問
私たちは皆、Haskellがデフォルトで遅延であることを知っています(あるいは知っているはずです)。評価されなければならないときまで何も評価されません。では、いつ何かが評価されなければならないのでしょうか?Haskell には厳密でなければならないポイントがあります。私はこれを「厳密性ポイント」と呼んでいますが、この用語は思ったほど広まっていません。私に言わせれば
Haskellにおける削減(または評価) だけ は厳密性ポイントで発生します。
そこで質問です。
とは何ですか。
正確に
Haskellの厳密性のポイントは何ですか?
私の直感では
main
,
seq
/ bangパターン、パターンマッチ、そして任意の
IO
を介して実行されるアクション
main
が主な厳密性のポイントですが、なぜそうなのかはよくわかりません。
(また、もしそれらが "厳密性ポイント" と呼ばれないのであれば、どのような は と呼ばれるのでしょうか?)
私は良い答えがWHNFやその他についてのいくつかの議論を含むと想像しています。また、ラムダ計算について触れるかもしれないと想像しています。
編集: この質問についての追加の考えです。
この質問を振り返ってみると、厳密性ポイントの定義に何かを追加した方がより明確になると思います。厳密性ポイントは、さまざまな コンテキスト と変化し 深さ (または厳密性) を変化させます。Haskell における削減は厳密性ポイントでのみ発生する」という私の定義に立ち戻り、その定義に次の句を追加してみましょう: "厳密性ポイントは、その周囲のコンテキストが評価または削減されたときにのみトリガーされます。
では、私が欲しい答えの種類を始めてみます。
main
は厳密性ポイントです。これは、そのコンテキストであるプログラムの主要な厳密性ポイントとして特別に指定されています。プログラム(
main
のコンテキスト) が評価されるとき、main の厳密性ポイントが有効になります。main の深さは最大であり、完全に評価されなければならない。Main は通常 IO アクションで構成され、これも厳密性ポイントであり、 そのコンテキストは
main
.
次に試すのは、議論
seq
とパターンマッチをこれらの用語で説明します。関数適用のニュアンスを説明する:どのように厳密か?どのように厳密ではないのですか?また
deepseq
?
let
そして
case
の文は?
unsafePerformIO
?
Debug.Trace
? トップレベルの定義? 厳密なデータ型? バングパターン? などなど。これらのうち、seqやパターンマッチだけで記述できるものはいくつあるのでしょうか?
どのように解決するのか?
まず、この論文を理解することから始めるとよいでしょう。 遅延評価のための自然なセマンティクス (Launchbury)を理解することから始めるのが良いでしょう。 これは、GHCのCoreに似た小さな言語に対して、式がいつ評価されるかを教えてくれるものです。 そして残る問題は、Haskell の完全版を Core にどのように対応付けるかですが、その翻訳のほとんどは Haskell のレポートそのものが与えてくれます。 GHCではこのプロセスをquot;desugaring(構文解析)と呼び、これは構文解析を除去するためです。
GHCはdesugaringとコード生成の間に最適化の一群を含み、これらの変換の多くは、異なる時間に評価されるようにCoreを並べ替えるからです(特に厳密性解析は、より早く評価されるようになります)。 そのため、どのように の プログラムがどのように評価されるかを理解するには、GHCによって生成されるCoreを見る必要があります。
おそらくこの回答はあなたにとって少し抽象的に見えるかもしれませんが(私は特にbangパターンやseqについて言及しませんでした)、あなたは何かを求めました。 正確な
であり、これが私たちにできる最善の方法です。関連
-
[解決済み】Haskellでの挿入ソート
-
[解決済み] Hindley-Milnerのどの部分が理解できないのでしょうか?
-
[解決済み] .の違いは何ですか?(ドット)と$(ドルマーク)の違いは何ですか?
-
[解決済み】Weak Head Normal Formとは何ですか?
-
[解決済み] GHCiの複数行コマンド
-
[解決済み] ハスケル Where vs. Let
-
[解決済み] Haskellの派生はどのように行われるのですか?
-
[解決済み] ハスケルでControl.Monad.Writerを遊ぶには?
-
[解決済み] 型チェッカーは非常に間違った型置換を許可しているが、プログラムはまだコンパイルできる
-
[解決済み] 難読化されたHaskellのコードはどのように動作するのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 一般的に `{- |` で始まるHaskellのコメントは何を意味するのですか?
-
[解決済み] 機能における非網羅的なパターン【重複あり
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み] RustのtraitとHaskellのtypeclassの違いは何ですか?
-
[解決済み] GHCはなぜこんなに大きいのか/大きいのか?
-
[解決済み] レコードの単一フィールドを割り当て、残りのフィールドはコピーするための省略記法?
-
[解決済み] Haskellでグラフはどのように表現するのか?
-
[解決済み] <*>は何と呼ばれ、何をするのですか?[クローズド]
-
[解決済み] Haskellプログラムのパフォーマンス解析ツール
-
[解決済み] 型チェッカーは非常に間違った型置換を許可しているが、プログラムはまだコンパイルできる