Haskell stack,如何全局还原多个包中发现的模组名称不明确

Haskell stack,如何全局还原多个包中发现的模组名称不明确,haskell,ghci,haskell-stack,Haskell,Ghci,Haskell Stack,然而,我安装的软件包似乎与其他安装的软件包冲突 我跑 $ stack install regex-pcre-text regex-pcre-builtin-0.94.4.8.8.35: configure regex-tdfa-1.2.3.1: download regex-pcre-builtin-0.94.4.8.8.35: build regex-tdfa-1.2.3.1: configure regex-tdfa-1.2.3.1: build regex-pcre-builtin-0.9

然而,我安装的软件包似乎与其他安装的软件包冲突

我跑

$ stack install regex-pcre-text
regex-pcre-builtin-0.94.4.8.8.35: configure
regex-tdfa-1.2.3.1: download
regex-pcre-builtin-0.94.4.8.8.35: build
regex-tdfa-1.2.3.1: configure
regex-tdfa-1.2.3.1: build
regex-pcre-builtin-0.94.4.8.8.35: copy/register
regex-tdfa-1.2.3.1: copy/register
regex-tdfa-text-1.0.0.3: download    
regex-tdfa-text-1.0.0.3: configure   
regex-tdfa-text-1.0.0.3: build       
regex-tdfa-text-1.0.0.3: copy/register
regex-pcre-text-0.94.0.1: download    
regex-pcre-text-0.94.0.1: configure   
regex-pcre-text-0.94.0.1: build       
regex-pcre-text-0.94.0.1: copy/register
Completed 4 action(s).                
我再也不能简单地导入了

Text.Regex.PCRE
当我尝试时,我现在看到:

$ stack ghci
Prelude> :set -XOverloadedStrings
Prelude> import Text.Regex.PCRE
屈服

<no location info>: error:
    Ambiguous module name ‘Text.Regex.PCRE’:
      it was found in multiple packages:
      regex-pcre-0.94.4 regex-pcre-builtin-0.94.4.8.8.35
我不太愿意直接运行这个
堆栈路径--local bin
,因为我不知道它将要做什么,也不知道它是否可以反转(这是我在安装上述包时的错误)。我的导入问题的正确解决方案是什么

更新1 我尝试了以下建议:


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

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

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

$ stack exec ghc-pkg unregister regex-pcre-text regex-pcre-builtin
但是考虑到您已经删除了第一个包,我相信这将失败,并显示一条消息,
regex pcre text
未找到。)

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

Prelude> :set -XPackageImports
Prelude> import "regex-pcre" Text.Regex.PCRE
Prelude Text.Regex.PCRE>

一般来说,你可以用它来做这样的事情。相关:根据我的经验,你不应该用堆栈来全局安装东西。每次都会让人头疼。相反,您可以为项目目录创建一个沙盒环境,所有依赖项(包括ghc二进制文件)都将在该目录内独立管理。就我所知,在您的特定情况下,和是同一个包的不同版本,因此它们应该是可互换的。由于
regex-pcre-text
需要
regex-pcre-builtin
,只要您的任何依赖项都不需要
regex-pcre
,我就删除它。然后,当您导入
Text.Regex.PCRE
时,它将使用
Regex-PCRE-builtin
,这应该可以正常工作。只需
import Text.Regex.PCRE
即可生成
:1:1:错误:模组名称“Text.Regex.PCRE”不明确:它在多个包中找到:Regex-PCRE-0.94.4 Regex-PCRE-builtin-0.94.4.8.35
谢谢,正是这样——我俩都必须在项目目录之外运行它,而且它很可能成功了,尽管它显示了一条错误消息,这让我很困惑。这样做解决了我的问题。
$ stack exec ghc-pkg unregister regex-pcre-text
$ stack exec ghc-pkg unregister regex-pcre-builtin
$ stack exec ghc-pkg unregister regex-pcre-text regex-pcre-builtin
Prelude> :set -XPackageImports
Prelude> import "regex-pcre" Text.Regex.PCRE
Prelude Text.Regex.PCRE>