Ошибка в реализации Data.Map?

Я наткнулся на то, что, как я предполагаю, является ошибкой в ​​Data.Map, но это также вполне возможно, что это ошибка в моих знаниях Haskell. Надеюсь, кто-нибудь сможет прояснить, что это такое :)

Пожалуйста, обратитесь к этой сути. преобразование структуры циклического связанного списка в поток байтов. Для любого данного узла в форме:

data Node = Node
  { val  :: Word8
  , next :: Node
  }

я ожидаю, что он будет сериализован как пара байтов: первый байт представляет val, а второй байт представляет смещение в потоке байтов, где следующий может быть расположен. Например, я ожидаю, что

let n0 = Node 0 n1
    n1 = Node 1 n0

будет сериализовано как [0, 1, 1, 0]. Ничего страшного.

Немного сложная часть здесь заключается в том, что я использую экземпляр MonadFixдля RWST, чтобы «связать узел» смещений байтового потока: я поддерживаю карту от узлов к смещениям, заполнение карты во время сериализации, а также ссылки на записи в карте, которые не обязательно существуют до завершения сериализации.

Это прекрасно работает, когда реализована картаData.HashMap.Lazy(из unordered-containers). Однако, когда реализация является обычнойData.Map(из container), программный стек переполняется — без каламбура — с Mapбесконечными попытками сравните два узла, используя (==).

Итак, мой вопрос:это ошибка в Data.Map, или мои предположения о том, как эти структуры должны вести себя в присутствии mfixошибочны?

16
задан mergeconflict 24 June 2012 в 19:28
поделиться