Я наткнулся на то, что, как я предполагаю, является ошибкой в 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
ошибочны?