Haskell: Есть ли более общий класс хранилища ключей / значений, чем MArray? - PullRequest
4 голосов
/ 29 июля 2011

Я не уверен, недооцениваю ли я мощность MArray или нет, но для многих алгоритмов, которые я реализую, меня волнует только то, что у меня есть некоторая структура данных для хранения ключа / пары значений. Очевидно, что выбор структуры данных повлияет на производительность, но было бы неплохо сначала написать алгоритм и по мере необходимости работать над оптимизацией структуры данных.

Что мне действительно нравится, так это класс типов:

 class Monad m => MStore m k v where
   putAt :: k -> v -> m ()
   getAt :: k -> m v
   -- and possibly
   pairs :: m [(k,v)]

Таким образом, мой алгоритм может манипулировать вещами типа k, не беспокоясь о том, является ли он Text, и мне нужно использовать хеш-таблицу, или излишне обобщать и упускать из-за возможности оптимизации массива Int ключей.

1 Ответ

4 голосов
/ 29 июля 2011

Просто чтобы повторить комментарии, на самом деле нет такой вещи в общем использовании. Быстрое и грязное решение состоит в том, чтобы определить putAt, getAt и пары локально как псевдонимы для соответствующих функций в выбранной вами текущей структуре данных. Затем вы можете просто перейти к новой структуре данных, переопределив функции (и если вы используете псевдоним типа для своей структуры данных, то вы можете использовать сигнатуры типов без необходимости их переопределения). Это просто абстрактный тип данных по соглашению на лету. Если хотите, вы можете переключиться на новый тип для правильного применения объявления.

Обратите внимание, что библиотека edison (на основе работы Окасаки над функциональными структурами данных) пытается предоставить общий API контейнеров, но API действительно реализован только для структур, предоставляемых edison: http://hackage.haskell.org/package/EdisonAPI

...