我一直在尝试从cabal安装BNF converter,但是在构建它时出现了一个问题。显然,这个包混合使用了来自haskell98和base版本4.*的模块。这带来了一个问题,如果你在haskell98隐藏的情况下编译,那么一些模块就找不到了。然而,如果你在编译时暴露了haskell98,那么ghc就不能知道它是应该使用新的前奏还是haskell98前奏!
错误消息:
Main.hs:1:1:
Ambiguous module name `Prelude':
it was found in multiple packages: base haskell98-2.0.0.1
您如何解决这样的错误?
发布于 2012-03-28 18:57:26
纠缠维护人员上传修复程序。或者,如果他们没有响应,可以考虑自己接管维护工作。
这是因为haskell98是一个兼容包,它复制了其他模块中的函数。新的代码不应该依赖它,除非它是Haskell-98兼容的。然而,这一变化是相对较新的,许多旧代码都引用了"base“和"haskell98”,尽管它实际上并没有使用"haskell98“包。
在短期内,我将运行cabal unpack BNFC
,然后编辑".cabal“文件,并从"build-depends:”字段中删除对haskell98
的引用。我还会修改库的版本号(这一步对可执行文件并不重要)。然后从您刚刚编辑的本地副本进行构建和安装。如果BNFC打算使用mtl版本1,可能还有其他问题,但如果需要,您可以自己添加该约束。
发布于 2018-05-28 10:38:59
一种解决方法是使用语言扩展NoImplicitPrelude
和PackageImports
。former会阻止Haskell导入其中一个前奏,这将会失败。second extension允许指定要从中导入模块的包和版本:
导入"base“前奏
或
导入"haskell98“前奏
https://stackoverflow.com/questions/9913299
复制相似问题