Haskell:是否存在比MArray更通用的键/值存储类?

时间:2011-07-28 21:57:00

标签: arrays data-structures haskell monads typeclass

我不确定我是否低估了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 个答案:

答案 0 :(得分:4)

只是为了回应这些评论,实际上并没有这样的东西是常用的。快速和快速脏解决方案是在本地定义putAt,getAt和pair作为别名,以选择当前数据结构上的相应函数。然后,您可以通过重新定义函数来交换到新的数据结构(如果您为数据结构使用类型别名,那么您可以使用类型签名而无需重新定义这些类型)。根据惯例,这只是一个抽象数据类型。如果您愿意,可以切换到新类型以正确执行adt。

请注意,edison库(基于Okasaki在功能数据结构方面的工作)尝试提供通用容器API,但API实际上仅针对edison提供的结构实现:http://hackage.haskell.org/package/EdisonAPI