Data.Map实现中的错误?

mer*_*ict 16 containers haskell monadfix tying-the-knot

我一直在说我的东西绊倒猜测是一个错误Data.Map,但也很可能在我的Haskell知识的错误.希望有人能澄清它是什么:)

请参考这个要点.我正在将循环链表结构序列化为字节流.对于任何给定节点,形式如下:

data Node = Node
  { val  :: Word8
  , next :: Node
  }
Run Code Online (Sandbox Code Playgroud)

我希望它被序列化为一对字节:表示第一个字节val,第二个字节表示next可以定位的字节流中的偏移量.例如,我希望:

let n0 = Node 0 n1
    n1 = Node 1 n0
Run Code Online (Sandbox Code Playgroud)

被序列化为[0, 1, 1, 0].没什么大不了.

这里稍微棘手的部分是我正在利用MonadFix实例RWST来"绑定"字节流偏移:我维护一个从节点到偏移的映射,在序列化期间填充映射,但也引用了映射中没有的映射必然存在,直到序列化完成.

当地图实现Data.HashMap.Lazy(来自无序容器)时,这非常有用.但是,当实现是通常的Data.Map(从容器)时,程序堆栈溢出 - 没有双关语意图 - Map尝试无限地比较两个节点使用(==).

所以我的问题是:这是一个错误Data.Map,或者我对这些结构在存在mfix缺陷时应该如何表现的假设?

Dan*_*her 22

您的Ord实例不起作用:

instance Ord Node where -- for use in Data.Map
  Node a _ < Node b _ = a < b
Run Code Online (Sandbox Code Playgroud)

对于工作Ord实例,您必须定义compare(<=).如果你只定义(<),那么任何调用compare(<=)将无限循环,因为两者都有彼此的默认实现.其他成员Ord也按照定义,compare除了(<)可行之外什么都没有.

  • **该死的,我是个白痴.**我才意识到自己.好事我在互联网上制作自己的屁股没问题. (11认同)
  • @mergeconflict没有羞耻!如果你不尴尬自己,你不是在学习! (5认同)