Как указывает Анкур, вы можете находиться за пределами чисто функциональной стороны Хаскелла. По крайней мере, я никогда не видел чистой структуры данных с минимальной выдержкой и хорошей производительностью памяти - не думайте, что ее нет. Вы профилировали существующие библиотеки, чтобы убедиться, что они не соответствуют вашим потребностям? (Помните, что постоянная структура данных не означает, что вся структура данных копируется всякий раз, когда производится мутация, может быть много совместного использования между различными "версиями").
Однако у Haskell также есть императивная сторона, и вы можете реализовать кучу на этой стороне. Характеристики производительности императивного Haskell близки к характеристикам любого другого императивного языка, поэтому вы, вероятно, захотите основать свою кучу на изменяемом массиве некоторого типа.
Может быть сложно реализовать его так, чтобы он прекрасно работал с STM, основной концепцией которого является TVar. Вы могли бы основывать его на (даже не изменяемом) массиве TVars, но, поскольку каждая операция касается корня кучи, возникнет много споров, и издержки STM повредят вам. Я был бы более склонен сериализовать доступ к куче к одному потоку за раз, используя блокировки / MVars .
Я знаю Data.Vector.Mutable - это популярная библиотека изменяемых массивов. Другие будут более осведомлены, чем я, порекомендовав хорошую библиотеку изменяемых массивов для ваших целей.