1. ホーム
  2. haskell

[解決済み] Haskellのストリクトネスポイントは何ですか?

2023-03-11 01:13:55

質問

私たちは皆、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について言及しませんでした)、あなたは何かを求めました。 正確な

であり、これが私たちにできる最善の方法です。