我不确定我是否低估了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
键的数组优化性
答案 0 :(得分:4)
只是为了回应这些评论,实际上并没有这样的东西是常用的。快速和快速脏解决方案是在本地定义putAt,getAt和pair作为别名,以选择当前数据结构上的相应函数。然后,您可以通过重新定义函数来交换到新的数据结构(如果您为数据结构使用类型别名,那么您可以使用类型签名而无需重新定义这些类型)。根据惯例,这只是一个抽象数据类型。如果您愿意,可以切换到新类型以正确执行adt。
请注意,edison库(基于Okasaki在功能数据结构方面的工作)尝试提供通用容器API,但API实际上仅针对edison提供的结构实现:http://hackage.haskell.org/package/EdisonAPI