問題タブ [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.
haskell - P. Wadler の論文の「The Strictness Monad」の「⊥」は何を意味しますか?
「モナドの理解」というタイトルのワドラーの論文からの次の定義を理解するのを手伝ってくれる人はいますか? (抜粋はセクション 3.2/9 ページ、つまり「厳密性モナド」サブセクションからのものです。)
遅延関数型プログラムでは、評価の順序を制御する必要がある場合があります。これは通常、次のように定義された計算可能な関数strictで実現されます。
厳密な f x = x ≠ ⊥ の場合、f xでなければ ⊥.
操作上、厳密な f xは、最初にxを弱頭部正規形 (WHNF) に減らし、次にアプリケーションf xを減らすことによって減らされます。または、 xとf xを並列に減らすことは安全ですが、 xが WHNF になるまで結果へのアクセスを許可しません。
この論文では、2 本の垂直線で構成される記号の使用をまだ確認していないため (それが何と呼ばれているかはわかりません)、どこからともなく出てきます。
Wadler が「遅延プログラムの評価を制御するために [厳密な] 内包表記を使用する」と述べていることを考えると、理解することは非常に重要な概念のように思えます。
haskell - BangPatterns はどこに表示されますか
GHC のユーザー ガイドによると、ほとんどの場合は のように見えPat
ますPBangPat
が、いくつかの例外があります。たとえば、モジュールのトップレベルの前髪 ( など!main
) は許可されておらず、解析に x : !xs
失敗しますx : (!xs) parses
@chi に感謝します。前髪を追加できる場所に関する正式な仕様は何ですか? ユーザー ガイドとレポートのいくつかの章を調べましたが、何も見つかりませんでした。
haskell - Strict Maybe はデータ定義で
data
さまざまなパフォーマンスの問題を回避するために厳密なフィールドを含める必要がある多くの講演を見たり、ブログ投稿を読んだりしました。
これは私にとって完全に理にかなっています。そのデータに対する関数操作は遅延するため、構成可能性は犠牲になりません。
しかし、Maybe
フィールドを追加すると:
私はデータ構造に怠惰を導入しています。結局のところ、これMaybe
は制御構造です。評価されていないサンクをJust
コンストラクタの後ろに隠すことはできませんか?
ただし、厳密Maybe
にはstrict
or スルーがありstrict-base-types
ます。しかし、逆の依存関係 ( strict、strict-base-types ) によると、それらは広く使用されていません。
Maybe
では、質問:非制御データ定義でstrict を使用する必要があるのはなぜですか?
haskell - Haskell wikibook での反駁できない/怠惰なパターン演習
ここの半分まで...
https://en.wikibooks.org/wiki/Haskell/Laziness
head
...反論の余地のないパターンを使用する関数の代替実装への変更の影響について尋ねる演習です。次のようにの定義を提供しますが、最初の方程式の反駁できない一致によりhead'
常に返されることに注意してください。undefined
次に、次のように尋ねます。
head'
ここで役立つように方程式の順序を変更しないのはなぜですか?- 最初の方程式が通常の反駁可能なパターンを使用するように変更された場合、 の動作は の動作とは
head'
異なりhead
ますか? もしそうなら、どのように?
GHC 7.8.4 では、順序を変更すると、少なくともこの関数が の通常の部分バージョンのように動作する程度までは「役立つ」ように見えますhead
が、空のリストの場合は別の例外があります。2 番目の質問に対する答えは「いいえ」のように見えますが、「もしそうなら、どのように」という補遺を考えると、ここでも何かが欠けているように感じます。誰でも私を啓発できますか?残念ながら、このページのソリューション リンクでは、この演習はカバーされていません。
haskell - IOモナドは埋め込まれたmapMの短絡を防ぎますか?
次のコードでやや当惑しました。問題のおもちゃではないバージョンでは、モナド結果でモナド計算を実行しようとしています。その値は、IO 内からのみ構築できます。IO の背後にある魔法がそのような計算を厳密にするようですが、それがどのように起こるのか正確にはわかりません。
コード:
出力:
haskell - Haskell で CAF を回避する
CAF(リソース共有)を避けるため、仮引数付きの関数に変換してみましたが、成功しませんでした(noCafB
)。How to make a CAF not a CAF in Haskell? を読みました。で試しnoCafC
てみnoCafD
ました。でコンパイルすると
-O0
、仮引数を持つ関数は毎回評価されました。しかし では、-O2
GHC はそれらの関数を CAF に変換するようです。これは意図した動作 (GHC の最適化) ですか?
での結果-O2
での結果-O0
なしでも試しましtrace
たが、結果は同じでした。の下で、プロファイリング出力を調べると、関数-O2
の結果が共有されていることがわかりました。incInt
なぜこの振る舞いをするのですか?
コメントをお待ちしております。ありがとう。
haskell - 厳格な関数と遅延関数のマッピング
f が厳密な場合、すべての xs リストで機能します。誰も私に例を挙げてもらえますか? 非厳密な f では機能しないのはなぜですか?
haskell - Haskellで「厳密なワイルドカード」を使用すると便利なのはいつですか?それは何をしますか?
Haskell のソース コードをいくつか見ていたところ、 とのパターン マッチが見つかり!_
ました。コードは次のとおりです。
「厳密なワイルドカード」がどのように機能するのか、なぜこの関数 (または他の関数) に役立つのか、よくわかりません。
haskell - Haskell の seq はどのように使用されますか?
したがって、Haskellseq
関数は最初の引数の評価を強制し、2 番目の引数を返します。したがって、これは中置演算子です。式の評価を強制したい場合、直観的にそのような機能は単項演算子になります。だから、代わりに
それはそのようになります
したがって、必要な値が の場合a
、なぜ戻りb
、どのように の戻り値を構築しますかb
。明らかに、私は Haskell を考えていません。:)
haskell - 評価または $! マルチスレッドのモナドコンテキストで値を WHNF 強制するのに十分ですか、それとも pseq が必要ですか?
Surely tomorrow
以下はうまくいくようです(次のように:毎秒言い続けます)
これは、evaluate
フォークされたlast [0..]
スレッドMVar
を
その後、プログラムは終了します。
ただし、evaluate
を使用しseq
ます。seq
決定論的並列処理のコンテキストでは、評価順序を実際に保証するには不十分であることが常に強調されます。この問題はモナドのコンテキストでは発生しませんか、それともより適切に使用する必要がありますか
コンパイラが評価の順序を変更できないようにするには、tryTakeMVar
時期尚早に成功しますか?