問題タブ [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 - データ型の厳密なフィールドの利点
これは少しあいまいかもしれませんが、私はしばらくの間それを疑問に思っていました。私の知る限り!
、値が作成される前に、データコンストラクターのパラメーターが評価されていることを確認できます。
怠惰は素晴らしいことだとよく思います。!
さて、ソースを調べると、 -lessバリアントよりも厳密なフィールドが頻繁に表示されます。
これの利点は何ですか、そしてなぜ私はそれをそのまま怠惰にすべきではないのですか?
haskell - Monad ではなく Functor のみを使用する厳密な fmap
最近私の注意を引いた怠惰なIOの1つの苛立ち
遅延 IO のため、上記のプログラムは何も出力しません。したがって、これは の厳密なバージョンで解決できると想像しましたfmap
。実際、私はちょうどそのようなコンビネータを思いつきました:
に置き換える<$>
と、<$!>
実際に問題が軽減されます。しかし、私は満足していません。きつすぎると感じる制約があります<$!>
。Monad
それはコンパニオン<$>
のみを必要としFunctor
ます。
制約<$!>
なしで書く方法はありますか?Monad
もしそうなら、どのように?そうでない場合、なぜですか?私はあらゆる場所で厳格さを投げようとしましたが、役に立ちませんでした(次のコードは期待どおりに機能しません):
haskell - 不要な厳密さをデバッグしていますか?
どうしていいかわからない問題があります。誰かが特定の問題について私を助けてくれるかどうか尋ねようとしていましたが、より一般的な質問をすることができ、結果としてより一般的な理解が得られることを願っています. うまくいけば。だからここに行きます:
たとえば、スペース リークなどの明らかな問題が発生するため、プログラムがあまりにも怠惰な場合は、通常は明らかです。逆の問題があります: 私のプログラムは厳しすぎます。私は結び目を作ろうとし ていますが、私がやろうとしている特定のことが、私が必要とする怠惰をどうにかして打ち負かすことがわかりました. 私の一般的な質問は、不要な厳密さをどのようにデバッグするのですか?
完全を期すために、ここに私の具体的なケースを示します。私はRWS
、ライター コンポーネントがマップにデータを入力し、リーダー コンポーネントがそのマップの最終状態を観察します。マップへの入力が完了するまで、このマップに対して厳密なことを行うことはできません。次のように、マップ内の値を検索することは問題ないようです。
しかし、 の(!)
使用error
に失敗します。代わりに、モナドの の使用に失敗することを好みfail
ます。だから私は次のようなことをしたいと思います:
これにより、私のプログラム<<loop>>
は理解できません。これがを使用するよりも厳密であるようには思え(!)
ませんが、明らかに私は間違っています...
performance - Haskell プログラムのプロファイリング
を使用して確率分布から繰り返しサンプリングするコードがありますsequence
。道徳的には、次のようなことを行います。
もう少し複雑であることを除いて。私が興味を持っている実際のコードは、この Github repo のlikelihoodWeighting
関数です。
実行時間は と非線形にスケーリングすることに気付きましたn
。特に、n
一定の値を超えるとメモリ制限に達し、実行時間が爆発的に増加します。確かではありませんが、これsequence
は の呼び出しまで評価されないサンクの長いリストを作成しているためだと思いますsum
。
約 100,000 個のサンプルを超えると、プログラムの速度が遅くなり、クロールします。これを最適化したい (私の感覚では、1000 万のサンプルは問題にならないはずです) ので、プロファイリングすることにしましたが、プロファイラーの出力を理解するのに少し問題があります。
プロファイリング
main.hs
100,000 サンプルで関数を実行する短い実行可能ファイルをファイルに作成しました。これが実行からの出力です
最初に気づいたことは、約 1.5 GB のヒープを割り当て、その時間の 60% をガベージ コレクションに費やしていることです。これは一般的に怠惰が多すぎることを示していますか?
からの結果は次のとおりです。
これを初めて実行したとき、1 つの関数が繰り返し呼び出されていることが判明し、メモ化できることがわかりました。これにより、処理速度が 2 倍になりました。ただし、スペース リークは解決しませんでした。
これがヒーププロファイルです。ランタイムが 1.8 秒であると主張する理由がわかりません。この実行には約 6 秒かかりました。
プロファイラーの出力を解釈するのを手伝ってくれる人はいますか?つまり、ボトルネックがどこにあるかを特定し、スピードアップする方法を提案してくれますか?
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に対して厳密になります。これは本当ですか?
haskell - 厳密に何かが欠けている
私はこのコードを持っています:
次に、厳密な引数を使用して関数を呼び出します。私は試した:
と
しかし、厳密な議論があるかのようには動作しません。つまり、「開始」の後、次の評価を待つ必要があります。(divisors 12345678)
私は何が欠けていますか?
haskell - 正しい評価順序を得る方法がわからない
これら 2 つのコードの違い ( に関してx
) はわかりませんが、最初のコードは次のように完了します。
そして2番目のものはそうではありません(少なくともGHCiでは):
最初の例のように、ヒットしたときに 2 番目の例が完了しない原因は何x == 4
ですか?
x
との両方x == 4
( a 内)に強打パターンを追加しようとしましlet
たが、どちらも違いはないようです。
lazy-evaluation - Haskellの厳密なバージョンの意味は何ですか?
<Real World Haskell> に従い、 foldl'
の厳密版と言われていfoldl
ます。
しかし、私には理解するのが難しいです とはstrict
どういう意味ですか??
performance - Haskell foldl' (++) でのパフォーマンスの低下
私はこのコードを持っています:
これらの関数は、各要素に 2 を掛けたリストを返します。
ghci で:
newList_bad
関数の動作が の 200 倍遅いのはなぜnewList_good
ですか? それがそのタスクの良い解決策ではないことを理解しています。しかし、なぜこの無害なコードの動作がこれほど遅いのでしょうか?
この「4767099960バイト」とは何ですか?? その単純な操作のために、Haskell は 4 GiB を使用しました??
コンパイル後: