問題タブ [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 投票する
4 に答える
3749 参照

haskell - データ型の厳密なフィールドの利点

これは少しあいまいかもしれませんが、私はしばらくの間それを疑問に思っていました。私の知る限り!、値が作成される前に、データコンストラクターのパラメーターが評価されていることを確認できます。

怠惰は素晴らしいことだとよく思います。!さて、ソースを調べると、 -lessバリアントよりも厳密なフィールドが頻繁に表示されます。

これの利点は何ですか、そしてなぜ私はそれをそのまま怠惰にすべきではないのですか?

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

haskell - Monad ではなく Functor のみを使用する厳密な fmap

最近私の注意を引いた怠惰なIOの1つの苛立ち

遅延 IO のため、上記のプログラムは何も出力しません。したがって、これは の厳密なバージョンで解決できると想像しましたfmap。実際、私はちょうどそのようなコンビネータを思いつきました:

に置き換える<$>と、<$!>実際に問題が軽減されます。しかし、私は満足していません。きつすぎると感じる制約があります<$!>Monadそれはコンパニオン<$>のみを必要としFunctorます。

制約<$!>なしで書く方法はありますか?Monadもしそうなら、どのように?そうでない場合、なぜですか?私はあらゆる場所で厳格さを投げようとしましたが、役に立ちませんでした(次のコードは期待どおりに機能しません):

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

haskell - 不要な厳密さをデバッグしていますか?

どうしていいかわからない問題があります。誰かが特定の問題について私を助けてくれるかどうか尋ねようとしていましたが、より一般的な質問をすることができ、結果としてより一般的な理解が得られることを願っています. うまくいけば。だからここに行きます:

たとえば、スペース リークなどの明らかな問題が発生するため、プログラムがあまりにも怠惰な場合は、通常は明らかです。逆の問題があります: 私のプログラムは厳しすぎます。私は結び目を作ろうと いますが、私がやろうとしている特定のことが、私が必要とする怠惰をどうにかして打ち負かすことがわかりました. 私の一般的な質問は、不要な厳密さをどのようにデバッグするのですか?


完全を期すために、ここに私の具体的なケースを示します。私はRWS、ライター コンポーネントがマップにデータを入力し、リーダー コンポーネントがそのマップの最終状態を観察します。マップへの入力が完了するまで、このマップに対して厳密なことを行うことはできません。次のように、マップ内の値を検索することは問題ないようです。

しかし、 の(!)使用errorに失敗します。代わりに、モナドの の使用に失敗することを好みfailます。だから私は次のようなことをしたいと思います:

これにより、私のプログラム<<loop>>は理解できません。これがを使用するよりも厳密であるようには思え(!)ませんが、明らかに私は間違っています...

0 投票する
4 に答える
3420 参照

performance - Haskell プログラムのプロファイリング

を使用して確率分布から繰り返しサンプリングするコードがありますsequence。道徳的には、次のようなことを行います。

もう少し複雑であることを除いて。私が興味を持っている実際のコードは、この Github repo のlikelihoodWeighting関数です

実行時間は と非線形にスケーリングすることに気付きましたn。特に、n一定の値を超えるとメモリ制限に達し、実行時間が爆発的に増加します。確かではありませんが、これsequenceは の呼び出しまで評価されないサンクの長いリストを作成しているためだと思いますsum

約 100,000 個のサンプルを超えると、プログラムの速度が遅くなり、クロールします。これを最適化したい (私の感覚では、1000 万のサンプルは問題にならないはずです) ので、プロファイリングすることにしましたが、プロファイラーの出力を理解するのに少し問題があります。


プロファイリング

main.hs100,000 サンプルで関数を実行する短い実行可能ファイルをファイルに作成しました。これが実行からの出力です

最初に気づいたことは、約 1.5 GB のヒープを割り当て、その時間の 60% をガベージ コレクションに費やしていることです。これは一般的に怠惰が多すぎることを示していますか?

からの結果は次のとおりです。

これを初めて実行したとき、1 つの関数が繰り返し呼び出されていることが判明し、メモ化できることがわかりました。これにより、処理速度が 2 倍になりました。ただし、スペース リークは解決しませんでした。

これがヒーププロファイルです。ランタイムが 1.8 秒であると主張する理由がわかりません。この実行には約 6 秒かかりました。

ここに画像の説明を入力

プロファイラーの出力を解釈するのを手伝ってくれる人はいますか?つまり、ボトルネックがどこにあるかを特定し、スピードアップする方法を提案してくれますか?

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

haskell - Control.Parallel.StrategiesのEvalのバインド演算子は、その引数をどのように厳密に評価しますか?

Control.Parallel.Strategiesのソースコード(http://hackage.haskell.org/packages/archive/parallel/3.1.0.1/doc/html/src/Control-Parallel-Strategies.html#Eval)には、タイプEvalが含まれています。定義:

次のモナドインスタンスがあります。

バインドの定義のコメントに注意してください。なぜこのコメントは本当ですか?厳密性についての私の理解は、関数はその引数について「何かを知っている」必要がある場合にのみ厳密であるということです。ここで、bindはkをxに適用するだけなので、xについて何も知る必要はないように見えます(私には)。さらに、コメントは、関数が定義される前に、パターンマッチで厳密性が「誘導」されることを示唆しています。バインドが厳密である理由を誰かが理解するのを手伝ってもらえますか?

また、Evalは単なるアイデンティティモナドのようであり、bindの定義にコメントがあるとすると、bindはほとんどすべてのMonadに対して厳密になります。これは本当ですか?

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

haskell - 厳密に何かが欠けている

私はこのコードを持っています:

次に、厳密な引数を使用して関数を呼び出します。私は試した:

しかし、厳密な議論があるかのようには動作しません。つまり、「開始」の後、次の評価を待つ必要があります。(divisors 12345678)

私は何が欠けていますか?

0 投票する
3 に答える
118 参照

haskell - 正しい評価順序を得る方法がわからない

これら 2 つのコードの違い ( に関してx) はわかりませんが、最初のコードは次のように完了します。

そして2番目のものはそうではありません(少なくともGHCiでは):

最初の例のように、ヒットしたときに 2 番目の例が完了しない原因は何x == 4ですか?

xとの両方x == 4( a 内)に強打パターンを追加しようとしましletたが、どちらも違いはないようです。

0 投票する
4 に答える
265 参照

haskell - 存在する rseq/seq は参照透過性を壊しますか? そうでない代替アプローチはありますか?

0 投票する
3 に答える
956 参照

lazy-evaluation - Haskellの厳密なバージョンの意味は何ですか?

<Real World Haskell> に従い、 foldl'の厳密版と言われていfoldlます。

しかし、私には理解するのが難しいです とはstrictどういう意味ですか??

0 投票する
3 に答える
1197 参照

performance - Haskell foldl' (++) でのパフォーマンスの低下

私はこのコードを持っています:

これらの関数は、各要素に 2 を掛けたリストを返します。

ghci で:

newList_bad関数の動作が の 200 倍遅いのはなぜnewList_goodですか? それがそのタスクの良い解決策ではないことを理解しています。しかし、なぜこの無害なコードの動作がこれほど遅いのでしょうか?

この「4767099960バイト」とは何ですか?? その単純な操作のために、Haskell は 4 GiB を使用しました??

コンパイル後: