是否有一个标准的“不可变”;“地图”;(例如Data.Map、Data.HashMap)Haskell中的typeclass?

是否有一个标准的“不可变”;“地图”;(例如Data.Map、Data.HashMap)Haskell中的typeclass?,haskell,typeclass,Haskell,Typeclass,可以理解的是,字典的概念会产生许多不同的实现。因为这是Haskell,所以我将重点讨论不可变映射/哈希/dict。我希望能够为我正在开发的一个小库使用typeclass,并允许用户选择他们的Hash/Map/Dict实现 如果没有标准的typeclass,那么通过hackage提供typeclass似乎是有用的,如果没有,那么(作为库/API提供者)仍然可以从使用hackage包或自己的typeclass来允许用户为映射选择给定的实现中获益 假设我没有错过Dicts的类型类,那么在Haskell

可以理解的是,字典的概念会产生许多不同的实现。因为这是Haskell,所以我将重点讨论不可变映射/哈希/dict。我希望能够为我正在开发的一个小库使用typeclass,并允许用户选择他们的Hash/Map/Dict实现

如果没有标准的typeclass,那么通过hackage提供typeclass似乎是有用的,如果没有,那么(作为库/API提供者)仍然可以从使用hackage包或自己的typeclass来允许用户为映射选择给定的实现中获益

假设我没有错过Dicts的类型类,那么在Haskell中,不可变字典有什么特别的地方不适合类型类吗

更新


更一般的问题提供了许多有用的见解,这些见解对回答这个问题有很大帮助,但并没有为这种特殊情况提供实际的解决方案。

为类
映射的数据结构提供typeclass有一些无法解决的问题。幸运的是,背包有帮助。您可以在这里通过背包查看
地图
的界面:

我已经实现了此解决方案,并发布了一篇关于此接口的博客文章:


与TypeClass相比,Backback可能会更好地使用此功能。使用。我不知道存在模块签名,我认为这非常有用(特别是对于希望避免使用更高级的FP或分类理论背包背后的动机之一是保持简单的Haskell。为
地图
设置typeclass很可能会涉及到像
TypeFamilies
这样的高级功能,所以背包在这里真的很耀眼!抱歉,我错过了一些明显的东西,因为我对Haskell的开发相当陌生,但我似乎在hackage上找不到它。我有没有一个外部使用项目代码的建议方法?我看到了,所以假设您可能正在等待发布到hackage。嗯,我现在看到背包不仅仅是一个概念性的想法,需要使用next.hackage(目前),但我在那里也看不到软件包。@bbarker它不在Hackage上,因为在Hackage上维护它需要上载20个软件包。我想等待多个公共库支持首先实现(它几乎完成了,并将在最近几天内合并到
cabal
)。同时,您可以依赖GitHub存储库,
cabal
允许直接指定对GitHub的依赖关系。