Haskell 堆栈,如何全局恢复多个包中发现的不明确模块名称

Mit*_*ops 3 haskell ghci haskell-stack

尝试调试另一个问题时,我安装了一个似乎与我其他安装的一些软件包冲突的软件包。

\n\n

我跑了

\n\n
$ stack install regex-pcre-text\nregex-pcre-builtin-0.94.4.8.8.35: configure\nregex-tdfa-1.2.3.1: download\nregex-pcre-builtin-0.94.4.8.8.35: build\nregex-tdfa-1.2.3.1: configure\nregex-tdfa-1.2.3.1: build\nregex-pcre-builtin-0.94.4.8.8.35: copy/register\nregex-tdfa-1.2.3.1: copy/register\nregex-tdfa-text-1.0.0.3: download    \nregex-tdfa-text-1.0.0.3: configure   \nregex-tdfa-text-1.0.0.3: build       \nregex-tdfa-text-1.0.0.3: copy/register\nregex-pcre-text-0.94.0.1: download    \nregex-pcre-text-0.94.0.1: configure   \nregex-pcre-text-0.94.0.1: build       \nregex-pcre-text-0.94.0.1: copy/register\nCompleted 4 action(s).                \n
Run Code Online (Sandbox Code Playgroud)\n\n

我不能再简单地导入

\n\n
Text.Regex.PCRE\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我尝试时,我现在看到:

\n\n
$ stack ghci\nPrelude> :set -XOverloadedStrings\nPrelude> import Text.Regex.PCRE\n
Run Code Online (Sandbox Code Playgroud)\n\n

产量

\n\n
<no location info>: error:\n    Ambiguous module name \xe2\x80\x98Text.Regex.PCRE\xe2\x80\x99:\n      it was found in multiple packages:\n      regex-pcre-0.94.4 regex-pcre-builtin-0.94.4.8.8.35\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想将我的安装恢复到早期状态,以便我的计算机上Text.Regex.PCRE未经限定导入的代码继续像以前一样工作。

\n\n

然而,看起来堆栈没有明确的卸载:

\n\n
$ stack uninstall regex-pcre-text\n\nError: stack does not manage installations in global locations. The only global mutation stack performs is executable copying. For the default executable destination, please run stack path --local-bin\n
Run Code Online (Sandbox Code Playgroud)\n\n

我犹豫是否简单地运行它,stack path --local-bin因为我不知道它会做什么,或者是否可以逆转(这是我首先安装上述软件包时的错误)。解决我的导入问题的正确方法是什么?

\n\n

更新1

\n\n

我在这里尝试了建议:

\n\n
$ ghc-pkg unregister regex-pcre-text\nghc-pkg: cannot find package regex-pcre-text\n\n$ stack exec ghc-pkg unregister regex-pcre-text\nignoring (possibly broken) abi-depends field for packages\n
Run Code Online (Sandbox Code Playgroud)\n

K. *_*uhr 5

问题是安装了导致冲突的regexp-pcre-text依赖项。regex-pcre-builtin您想要在全局项目中(即在任何特定项目目录之外)运行以下两个命令:

$ stack exec ghc-pkg unregister regex-pcre-text
$ stack exec ghc-pkg unregister regex-pcre-builtin
Run Code Online (Sandbox Code Playgroud)

您已经运行了第一个,我怀疑它成功完成,尽管有有关字段的警告消息abi-depends,所以您只需要运行第二个。

(这些可以组合成一个命令:

$ stack exec ghc-pkg unregister regex-pcre-text regex-pcre-builtin
Run Code Online (Sandbox Code Playgroud)

但鉴于您已经删除了第一个包,我相信这会失败并显示一条regex-pcre-text未找到的消息。)

@DarthFennec提到的解决方案是使用PackageImports扩展来解决冲突。regex-pcre从 GHCi 来看,即使安装了两个软件包,也可以使用软件包中的模块:

Prelude> :set -XPackageImports
Prelude> import "regex-pcre" Text.Regex.PCRE
Prelude Text.Regex.PCRE>
Run Code Online (Sandbox Code Playgroud)