問題タブ [strictness]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
958 参照

haskell - P. Wadler の論文の「The Strictness Monad」の「⊥」は何を意味しますか?

「モナドの理解」というタイトルのワドラーの論文からの次の定義を理解するのを手伝ってくれる人はいますか? (抜粋はセクション 3.2/9 ページ、つまり「厳密性モナド」サブセクションからのものです。)


遅延関数型プログラムでは、評価の順序を制御する必要がある場合があります。これは通常、次のように定義された計算可能な関数strictで実現されます。

厳密な f x = x ≠ ⊥ の場合、f xでなければ ⊥.

操作上、厳密な f xは、最初にxを弱頭部正規形 (WHNF) に減らし、次にアプリケーションf xを減らすことによって減らされます。または、 xf xを並列に減らすことは安全ですが、 xが WHNF になるまで結果へのアクセスを許可しません。


この論文では、2 本の垂直線で構成される記号の使用をまだ確認していないため (それが何と呼ばれているかはわかりません)、どこからともなく出てきます。

Wadler が「遅延プログラムの評価を制御するために [厳密な] 内包表記を使用する」と述べていることを考えると、理解することは非常に重要な概念のように思えます。

0 投票する
1 に答える
621 参照

haskell - BangPatterns はどこに表示されますか

GHC のユーザー ガイドによると、ほとんどの場合は のように見えPatますPBangPatが、いくつかの例外があります。たとえば、モジュールのトップレベルの前髪 ( など!main) は許可されておらず、解析x : !xs失敗します x : (!xs) parses@chi に感謝します。前髪を追加できる場所に関する正式な仕様は何ですか? ユーザー ガイドとレポートのいくつかの章を調べましたが、何も見つかりませんでした。

0 投票する
2 に答える
601 参照

haskell - Strict Maybe はデータ定義で

dataさまざまなパフォーマンスの問題を回避するために厳密なフィールドを含める必要がある多くの講演を見たり、ブログ投稿を読んだりしました。

これは私にとって完全に理にかなっています。そのデータに対する関数操作は遅延するため、構成可能性は犠牲になりません。

しかし、Maybeフィールドを追加すると:

私はデータ構造に怠惰を導入しています。結局のところ、これMaybeは制御構造です。評価されていないサンクをJustコンストラクタの後ろに隠すことはできませんか?

ただし、厳密Maybeにはstrictor スルーがありstrict-base-typesます。しかし、逆の依存関係 ( strictstrict-base-types ) によると、それらは広く使用されていません。

Maybeでは、質問:非制御データ定義でstrict を使用する必要があるのはなぜですか?

0 投票する
1 に答える
397 参照

haskell - Haskell wikibook での反駁できない/怠惰なパターン演習

ここの半分まで...

https://en.wikibooks.org/wiki/Haskell/Laziness

head...反論の余地のないパターンを使用する関数の代替実装への変更の影響について尋ねる演習です。次のようにの定義を提供しますが、最初の方程式の反駁できない一致によりhead'常に返されることに注意してください。undefined

次に、次のように尋ねます。

  • head'ここで役立つように方程式の順序を変更しないのはなぜですか?
  • 最初の方程式が通常の反駁可能なパターンを使用するように変更された場合、 の動作は の動作とはhead'異なりheadますか? もしそうなら、どのように?

GHC 7.8.4 では、順序を変更すると、少なくともこの関数が の通常の部分バージョンのように動作する程度までは「役立つ」ように見えますheadが、空のリストの場合は別の例外があります。2 番目の質問に対する答えは「いいえ」のように見えますが、「もしそうなら、どのように」という補遺を考えると、ここでも何かが欠けているように感じます。誰でも私を啓発できますか?残念ながら、このページのソリューション リンクでは、この演習はカバーされていません。

0 投票する
2 に答える
220 参照

haskell - IOモナドは埋め込まれたmapMの短絡を防ぎますか?

次のコードでやや当惑しました。問題のおもちゃではないバージョンでは、モナド結果でモナド計算を実行しようとしています。その値は、IO 内からのみ構築できます。IO の背後にある魔法がそのような計算を厳密にするようですが、それがどのように起こるのか正確にはわかりません。

コード:

出力:

0 投票する
0 に答える
174 参照

haskell - Haskell で CAF を回避する

CAF(リソース共有)を避けるため、仮引数付きの関数に変換してみましたが、成功しませんでした(noCafB)。How to make a CAF not a CAF in Haskell? を読みました。で試しnoCafCてみnoCafDました。でコンパイルすると -O0、仮引数を持つ関数は毎回評価されました。しかし では、-O2GHC はそれらの関数を CAF に変換するようです。これは意図した動作 (GHC の最適化) ですか?

での結果-O2

での結果-O0

なしでも試しましtraceたが、結果は同じでした。の下で、プロファイリング出力を調べると、関数-O2の結果が共有されていることがわかりました。incIntなぜこの振る舞いをするのですか?

コメントをお待ちしております。ありがとう。

0 投票する
1 に答える
281 参照

haskell - 厳格な関数と遅延関数のマッピング

f が厳密な場合、すべての xs リストで機能します。誰も私に例を挙げてもらえますか? 非厳密な f では機能しないのはなぜですか?

0 投票する
1 に答える
370 参照

haskell - Haskellで「厳密なワイルドカード」を使用すると便利なのはいつですか?それは何をしますか?

Haskell のソース コードをいくつか見ていたところ、 とのパターン マッチが見つかり!_ました。コードは次のとおりです。

「厳密なワイルドカード」がどのように機能するのか、なぜこの関数 (または他の関数) に役立つのか、よくわかりません。

0 投票する
1 に答える
1304 参照

haskell - Haskell の seq はどのように使用されますか?

したがって、Haskellseq関数は最初の引数の評価を強制し、2 番目の引数を返します。したがって、これは中置演算子です。式の評価を強制したい場合、直観的にそのような機能は単項演算子になります。だから、代わりに

それはそのようになります

したがって、必要な値が の場合a、なぜ戻りb、どのように の戻り値を構築しますかb。明らかに、私は Haskell を考えていません。:)

0 投票する
2 に答える
109 参照

haskell - 評価または $! マルチスレッドのモナドコンテキストで値を WHNF 強制するのに十分ですか、それとも pseq が必要ですか?

Surely tomorrow以下はうまくいくようです(次のように:毎秒言い続けます)

これは、evaluateフォークされたlast [0..]スレッドMVar

その後、プログラムは終了します。

ただし、evaluateを使用しseqます。seq決定論的並列処理のコンテキストでは、評価順序を実際に保証するには不十分であることが常に強調されます。この問題はモナドのコンテキストでは発生しませんか、それともより適切に使用する必要がありますか

コンパイラが評価の順序を変更できないようにするには、tryTakeMVar時期尚早に成功しますか?