Какой хороший способ генерировать специальные клавиши, где каждый ключ уникален для программы? В идеале действие вида:
newKey :: IO Key
такое, что:
do a <- newKey
   b <- newKey
   return (a == b)
всегда возвращает false. Кроме того, должно быть возможно использовать Key в эффективном ассоциативном контейнере (например, a Map).
Это может быть использовано, например, для поддержки коллекции обработчиков событий, поддерживающих случайную вставку и удаление:
Map Key EventHandler
Параметры, о которых я знаю:
-  newIORef(): Удовлетворяет инварианту выше, но IORef не имеет экземпляра Ord.
-  malloc: Быстро, аPtr ()имеет экземпляр Ord, но результат не является сборкой мусора.
-  newStablePtr(): не собран мусор, аStablePtrне имеет экземпляраOrd.
-  newIORef() >>=makeStableName: должны удовлетворять инварианту выше и сбор мусора, но сложнее в использовании (требуется, чтобы я использовал хеш-таблицу).
-  mallocForeignPtrBytes1: Удовлетворяет оба критерия, но эффективен ли он?
 mallocForeignPtrBytes 1 кажется моим лучшим вариантом. Я полагаю, что я мог бы сделать его немного более эффективным, используя непосредственный приём GHC newPinnedByteArray#.
Есть ли лучшие варианты? Является ли подход  mallocForeignPtrBytes ошибочным по какой-то неочевидной причине?
