我在說我猜測是Data.Map
錯誤的東西絆倒了,但也很可能在我的Haskell知識的錯誤。希望有人能澄清這是:)Data.Map實現中的錯誤?
請參考this gist。我將一個循環鏈表結構序列化爲一個字節流。對於任何給定節點,該形式爲:
data Node = Node
{ val :: Word8
, next :: Node
}
我希望它被序列化爲一對字節:表示val
第一字節,並且表示在next
可以位於字節流的偏移的第二個字節。例如,我期望:
let n0 = Node 0 n1
n1 = Node 1 n0
被序列化爲[0, 1, 1, 0]
。沒什麼大不了。
這裏稍微棘手的部分是我在剝削MonadFix
實例RWST
爲「永結同心」的字節流偏移:我保持與節點偏移量的圖,序列化過程中填充的地圖,但還引用條目在序列化完成之前不一定存在的映射。
這個偉大的工程圖時實現Data.HashMap.Lazy
(從)。然而,當執行是通常的Data.Map
(從containers),程序堆棧溢出 - 沒有雙關語意 - 與Map
試圖無限使用(==)
兩個節點進行比較。
所以我的問題是:這是Data.Map
一個錯誤,或者是我對這些結構應該如何表現在mfix
存在缺陷的假設?
@RomanCheplyaka這需要我以前的可怕後,我已經刪除了的地方。你問完全看代碼,所以你在這裏:) – mergeconflict
另外,我剛剛發現(令我驚訝),'Data.HashMap.Strict'也很好。 – mergeconflict
現在你明白我爲什麼要求看代碼;) –