Arrays Haskell:有没有比MArray更通用的key/value store类?

Arrays Haskell:有没有比MArray更通用的key/value store类?,arrays,data-structures,haskell,monads,typeclass,Arrays,Data Structures,Haskell,Monads,Typeclass,我不确定我是否低估了的功能,但对于我实现的许多算法,我所关心的只是我有一些用于存储键/值对的数据结构。显然,数据结构的选择会影响性能,但最好先编写算法,然后根据需要优化数据结构 我真正想要的是一个类型类,如: class Monad m => MStore m k v where putAt :: k -> v -> m () getAt :: k -> m v -- and possibly pairs :: m [(k,v)] 因此,我的算

我不确定我是否低估了的功能,但对于我实现的许多算法,我所关心的只是我有一些用于存储键/值对的数据结构。显然,数据结构的选择会影响性能,但最好先编写算法,然后根据需要优化数据结构

我真正想要的是一个类型类,如:

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

因此,我的算法可以处理
k
类型的东西,而不必担心它是否是
文本
,我需要使用哈希表,或者过度泛化并忽略
Int
键的数组优化性。

只是为了回应注释,实际上并没有这种常用的东西。一个快速而肮脏的解决方案是在本地将putAt、getAt和pair定义为当前所选数据结构上相应函数的别名。然后,您可以通过重新定义函数来切换到新的数据结构(如果您为数据结构使用类型别名,则可以使用类型签名,而无需重新定义它们)。这只是一个抽象的数据类型。如果愿意,可以切换到新类型以正确执行adt


请注意,edison库(基于Okasaki关于函数数据结构的工作)试图提供一个通用的容器API,但该API实际上只针对edison提供的结构实现:

数据有什么问题吗通道这并不总是坏的(有时,这就是要使用的数据结构),但我希望在选择数据结构时具有多态性。我还没喝咖啡。哦,至少在Haskell中,类型类是开放的,因此您可以根据需要滚动自己的类并添加实例。那么您想根据键类型更改使用的数据结构吗?这正是我们要做的事情。如果你只是在寻找一个泛型类型类,这样你就可以避免提交到一个特定的容器类型,我实际上不认为有一个这样的类型。至少没有一个是常用的。获得一个正确的容器类型类API是很棘手的,而孤立的类API并不是很令人满意。这几乎涵盖了我所建议的所有内容。
newtype
方法应该非常有效,以确保您将所有其他内容独立于所使用的特定类型。谢谢!我仍然很难区分“这还没有在haskell的图书馆中”和“你找不到合适的地方”,所以这对我来说已经足够好了。