Haskellがデフォルトで怠惰であることを私たちは皆知っています(または知っているはずです)。評価する必要があるまで、何も評価されません。それでは、いつ何かを評価する必要がありますか?Haskellが厳密でなければならない点があります。私はこれらを「厳格なポイント」と呼びますが、この特定の用語は思ったほど広くはありません。私によると:
Haskellでの削減(または評価)は、厳密な点でのみ発生します。
だから問題は:Haskellの厳格なポイントは、正確には何ですか?私の直感ではmain
、seq
/ビッグバンパターン、パターンマッチング、およびIO
を介しmain
て実行されるすべてのアクションが主要な厳密ポイントであると述べていますが、なぜそれを知っているのか本当にわかりません。
(また、これらは「厳密ポイント」と呼ばれていない場合、何をしている彼らが呼ばれます?)
良い答えには、WHNFに関する議論などが含まれると思います。また、ラムダ計算に影響を与えるかもしれないと思います。
編集:この質問に関する追加の考え。
私がこの質問を反映したように、私は厳密さの点の定義に何かを追加するほうがより明確になると思います。厳密なポイントは、さまざまなコンテキストとさまざまな深さ(または厳密さ)を持つことができます。「Haskellでの削減は厳密なポイントでのみ発生する」という私の定義に戻り、その定義にこの句を追加しましょう:「厳密なポイントは、周囲のコンテキストが評価または削減されたときにのみトリガーされます」。
それで、私があなたに私が欲しい種類の答えから始めさせようと思います。main
厳格なポイントです。これは、そのコンテキストの主要な厳格なポイントであるプログラムに特別に指定されています。プログラム(main
のコンテキスト)が評価されると、mainの厳密性ポイントがアクティブになります。メインの深さは最大です。完全に評価する必要があります。メインは通常、IOアクションで構成されます。IOアクションは厳密性のポイントでもあり、そのコンテキストはmain
です。
seq
では、これらの用語でパターンマッチングについて話し合い、パターンマッチングを試してください。関数適用のニュアンスを説明してください:どのように厳密ですか?いかがですか?どうdeepseq
ですか?let
とcase
ステートメント?unsafePerformIO
?Debug.Trace
?トップレベルの定義?厳密なデータ型?バンパターン?等seqまたはパターンマッチングの観点から説明できるこれらの項目の数は?
seq
とパターンマッチングで十分だと思います。残りはそれらで定義されます。IO
たとえば、パターンマッチングは、アクションの脊椎の厳格さを保証すると思います。