問題タブ [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 - 一連の挿入時に HashMap が通常の形式にならないのはなぜですか?
私は ghc-heap-view パッケージとそれが提供するユーティリティを使用して、Haskell プログラムのメモリ内モデルの厳密性を確保しようとしてきましたHashMap
。 . ヒープ ツリーを印刷してみましたが、実際にいくつかのサンクが表示されます。次に、要素を挿入する別の方法 ( union
andを使用singleton
) を試しましたが、今回は厳密になります。
誰かがなぜそうなのかを説明insert
し、他の方法と同じように動作させるために私にできることがあるかどうかアドバイスしてもらえますか?
ここに私のテストコードがあります:
出力は次のとおりです。
haskell - レイジー状態トランスフォーマーは、2D 再帰でレイジー リストを熱心に消費します
ステート トランスフォーマーを使用して、2D 再帰ウォークのすべてのポイントでデータセットをランダムにサンプリングします。これにより、一緒に条件を満たしたサンプルの 2D グリッドのリストが出力されます。結果から遅延して取得したいのですが、私のアプローチでは、最初の結果を取得する前に、すべてのポイントでデータセット全体を使い果たします。
具体的には、次のプログラムを検討してください。
(x, y)
プログラムは からまで長方形のグリッドをたどり、State モナドのリストの 1 つの値を含むすべての結果を合計します:状態を読み取って進める(0, 0)
非自明なトランスフォーマー、または自明なトランスフォーマーのいずれかです。興味深いのは、アルゴリズムがとの先頭を超えて探索するかどうかです。st
unst
st
unst
提示されたコードでは、 がスローされundefined
ます。これは、変換を連鎖させる順序の設計ミス、特に状態処理の問題であると考えましたunst
。しかし、1D 再帰は、状態変換器を使用しても遅延を維持することがわかりました (幅ステップを削除し、ブロックを にb <- walk...
交換します)。liftM2
fmap
の場合、トリガーする前にグリッド全体をウォークするtrace (show (x, y))
こともわかります。
ここでは私の使用に問題があると思いますが、モナドの選択とウォークの次元がその成功に影響するため、変換を行うことがそれ自体が厳密性の原因であるとはsequence
広く言えません。sequence
ここで 1D 再帰と 2D 再帰の厳密さの違いの原因は何ですか? また、どうすれば必要な遅延を実現できますか?