GHC 8.8.4已添加hashable仍提示需添加该约束的问题求助
问题原因与解决方案
核心原因
这个问题源于hashable库的模块结构变更以及GHC 8.8.4环境下cabal依赖管理的特性:
- hashable 1.3.0.0版本将原本位于
Data.Hashable的Hashable类型类,拆分迁移到了Data.Hashable.Class模块; - 你通过
cabal install --lib安装的unordered-containers,依赖的正是这个版本的hashable库,因此它的所有函数(包括Set.map)的类型签名会绑定到hashable-1.3.0.0:Data.Hashable.Class.Hashable这个带版本前缀的约束; - 你的代码中默认导入的
Hashable来自Data.Hashable(即使这个模块只是重新导出Data.Hashable.Class的内容),在GHC 8.8.4的依赖隔离机制下,编译器会将其视为与unordered-containers依赖的约束不匹配,因此要求你显式指定带版本的约束。
GHC 9.2.4环境下没有这个问题,是因为更高版本的GHC/cabal工具链优化了依赖的兼容性处理,或者你当时使用的hashable版本已经完成了模块迁移的平滑过渡。
解决方案
1. 明确导入正确的模块
在代码中直接导入Data.Hashable.Class而非Data.Hashable,让签名中的Hashable约束与unordered-containers依赖的类完全一致:
import qualified Data.HashSet as Set import Data.Hashable.Class (Hashable) -- 替换原本的 import Data.Hashable powerset :: Hashable a => Set.Set a -> [Set.Set a] powerset = -- 你的实现
2. 使用cabal项目管理依赖(推荐)
避免直接使用cabal install --lib安装全局库,而是创建一个cabal项目文件(比如your-project.cabal),明确声明依赖版本:
cabal-version: 1.12 name: your-project version: 0.1.0.0 build-type: Simple executable your-executable main-is: YourFile.hs build-depends: base >=4.13 && <4.14, unordered-containers >=0.2.14, hashable >=1.3 && <1.4 default-language: Haskell2010
然后执行cabal build编译,cabal会自动处理依赖的一致性,避免版本和模块的冲突。
3. 编译时显式指定依赖包
如果必须使用全局库,可以在编译命令中明确指定依赖的hashable版本:
ghc -Wall -package hashable-1.3.0.0 -package unordered-containers-<你的版本号> YourFile.hs
注意替换<你的版本号>为你实际安装的unordered-containers版本。
内容的提问来源于stack exchange,提问作者ggegoge
相关产品推荐
相关产品推荐

