のバグだと思われるものに出くわしましたが、これは私のHaskellData.Map
の知識のバグである可能性も十分にあります。誰かがそれが何であるかを明確にできることを願っています:)
この要点を参照してください。循環リンク リスト構造をバイトストリームにシリアル化しています。任意のノードに対して、次の形式をとります。
data Node = Node
{ val :: Word8
, next :: Node
}
バイトのペアとしてシリアル化されることを期待しています。最初のバイトは を表し、2 番目のバイトはを配置できるval
バイトストリーム内のオフセットを表します。next
たとえば、次のことを期待しています。
let n0 = Node 0 n1
n1 = Node 1 n0
として連載予定[0, 1, 1, 0]
。大きな問題ではない。
ここで少しトリッキーな部分は、バイトストリーム オフセットの「結び目を結ぶ」MonadFix
ためにインスタンスを利用していることです。ノードからオフセットへのマップを維持し、シリアル化中にマップにデータを入力しますが、そうでないマップ内のエントリも参照します。RWST
シリアル化が完了するまで、まだ存在する必要があります。
これは、マップの実装がData.HashMap.Lazy
( unordered-containersから) である場合にうまく機能します。ただし、実装が通常の場合Data.Map
(コンテナーMap
から)、プログラム スタックがオーバーフローします (しゃれは意図されていません) (==)
。
私の質問は次のとおりです。これは のバグですか、それとも欠陥があるData.Map
場合にこれらの構造がどのように動作するかについての私の仮定ですか?mfix