【发布时间】:2012-06-26 04:33:12
【问题描述】:
我偶然发现了一些我猜测是 Data.Map 中的错误,但这也很可能是我的 Haskell 知识中的错误。希望有人能澄清它是什么:)
请参考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(来自unordered-containers)时,这很有效。然而,当实现是通常的Data.Map(来自containers)时,程序堆栈溢出——没有双关语——Map 无限尝试使用(==) 比较两个节点。
所以我的问题是:这是Data.Map 中的一个错误,还是我对这些结构在mfix 存在时应该如何表现的假设有缺陷?
【问题讨论】:
-
@RomanCheplyaka 这取代了我之前删除的可怕帖子。你要求查看完整的代码,所以你去 :)
-
另外,我刚刚发现(令我惊讶的是)
Data.HashMap.Strict也可以正常工作。 -
现在你明白我为什么要求查看代码了;)
标签: haskell containers monadfix tying-the-knot