2017-10-19 237 views
0

我试图加载我的.hs文件,但是当我import Data.Numbers.CReal时,它给了我错误Failed to load interface for 'Data.Numbers.CReal'。我拼命地跑了和cabal install numbers如果我cabal list --installed显示的数字PKG,但如果我ghc-pkg list它不会(也如果我ghc-pkg check它给黑线鳕警告的手)。它与我的非加载文件有关吗?我该如何解决这个问题?使用ghc-pkg列表和cabal列表 - 安装给出不同的列表

Ps。我知道如何导入包,但我不确定我是否正确导入了这个包。

如果我没有正确解释自己,谢谢并对不起。

回答

1

两种假设映入脑海:

  1. cabal是选择一个不同版本的ghc其主治工具包比你的壳。您可以通过运行这两个命令来检查这种差异:

    cabal exec -- ghc --version 
    ghc --version 
    

    他们说同样的事情吗?如果是的话,拒绝这个假设。否则,你应该决定是否喜欢外壳的选择或阴谋的选择更好(我建议更喜欢你的外壳的选择)。

    如果您更喜欢cabal的选择,您可以通过在命令中附加-<version>来使用特定版本的GHC(和其他GHC工具)例如请尝试ghc-pkg-7.10.3 list以查看版本7.10.3或ghci-7.10.3的软件包数据库中运行特定版本的REPL的内容。您可以通过添加符号链接或类似于您的PATH来使这些更改永久生效。

    如果你喜欢你的shell的选择更好的,你可以要求cabal使用该版本cabal configure -w ghc;或者如果您担心cabal和您的外壳将以不同方式解析ghc,则可以要求提供cabal configure -w ghc-7.10.3或类似的特定版本。

  2. 你的shell同意cabal关于使用什么版本的GHC,但你在一个cabal沙盒中。 cabal list --installed告诉你沙盒中安装了什么,但ghc-pkg list告诉你用户包数据库中安装了什么。您可以检查这两个命令之间的差异:

    cabal exec -- ghc-pkg list numbers 
    ghc-pkg list numbers 
    

    (如果你有一个新望阴谋 - 不知道该出现在哪个版本 - 你也可以尝试cabal hc-pkg list代替cabal exec -- ghc-pkg list这很可能是。更向前兼容的方式,所以一个良好的习惯来培养。)

    如果这些打印同样的事情,拒绝这种假设。否则,您应该决定是否要继续使用沙箱(我建议继续使用沙箱)。

    如果要停止使用沙箱,你可以通过--ignore-sandboxcabal。为了使其成为永久的,请查看cabal.sandbox.config文件,该文件将包含一个指向实际沙箱的指针(通常为.cabal.sandbox)。删除配置和沙箱。您也可以通过将ignore-sandbox: True添加到~/.cabal/config来全局忽略沙箱,但我强烈建议您不要这样做。

    如果您想保留沙箱,您需要使用cabal exec来满足您的所有GHC工具包需求,以确保选择正确的包数据库。例如,尝试使用cabal exec ghci来运行REPL,以访问沙箱包数据库。

这些假设并不相互排斥:可能发生。在这种情况下,我强烈建议选择最终的解决方案(“对所有GHC工具包执行使用cabal exec”),因为它可以透明地处理这两个问题:标准GHC工具组命令将被重写为指代明确版本化的命令(例如,cabal exec ghc实际上将执行ghc-7.10.3 ),环境将被设置为指向正确的包数据库。

0

这个问题的答案

您可以通过运行这两个命令检查这种差异:

阴谋EXEC - GHC --version GHC --version

做他们说一样的东西?

是的。我不记得第二个选项,但我已经设法自己解决它。我特别做的是:

  1. 运行命令“rm -rf .cabal”(不含指令)来删除cabal配置。
  2. 运行“室射频.cabal沙箱”
  3. 运行“室射频.ghc”
  4. 阴谋新建的阴谋(不知道这是否有助于或不)
  5. 在管理模式(命令)我编辑了cabal配置文件并将Ignore Sandbox更改为True - >这会在未来给我带来什么问题吗?我应该把它改回false吗?请回答
  6. 不得不删除一个cabal.sandbox.config这是给一些麻烦
  7. 阴谋小集团安装安装
  8. 阴谋更新

现在GHC-PKG list命令和小集团列表 - 安装显示我安装的软件包,并且他们工作没有问题。

Ps。我从这个过程中提供了详细的信息,以防将来有人需要它。仍然不确定是什么导致了cabal和ghc没有显示相同的pkgs。

+0

注意:不要意外删除'.cabal/config'。 – sapanoia

+0

我认为这个答案是“核选项”。我强烈建议未来的读者首先尝试更温和的解决方案;例如如果'cabal'选择了不同于你想要的GHC版本,你可以使用'cabal configure'来选择另一个版本(如'cabal configure -w ghc-7.10.3')。我将编辑我的答案,在此解决方案中包含一些评论。手动删除cabal沙箱是可以的(目前'cabal'没有办法以非手动的方式删除它们),但你应该明白为什么沙箱首先存在,并确保你实际上不需要它... –

+0

哦,我误解了;考虑到这里的细节,我强烈怀疑我的另一个提议的假设(“你在一个cabal沙箱中,'cabal list -installed'告诉你在沙箱中安装了什么,但'ghc-pkg list'告诉你什么是安装的在你的用户包数据库中“)是正确的。 'cabal configure'对此无能为力,但在我的回答中,我概括了两个温和的解决方案。 –