GHC 找不到已安装的模块

GHC can not find installed module

我的haskell安装找不到操作系统安装的bytestring模块

$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :m +Data.ByteString.Lazy

<no location info>:
Could not find module `Data.ByteString.Lazy'
It is not a module in the current program, or in any known package.

但是我已经使用 yum 安装了这个模块:

$ rpm -ql ghc-bytestring
/usr/lib64/ghc-7.6.3/bytestring-0.10.0.2
/usr/lib64/ghc-7.6.3/bytestring-0.10.0.2/libHSbytestring-0.10.0.2-ghc7.6.3.so
/usr/share/doc/ghc-bytestring
/usr/share/doc/ghc-bytestring/LICENSE

怎么了?

如果发生这种情况,您应该能够通过 ghc-pkg list 了解更多信息。例如,如果您的软件存储库提供的二进制包被破坏,就会发生这种情况; ghc-pkg list 会报告。一般来说,要么 GHC 没有在 /usr/lib64/ghc-7.6.3/ 中寻找包,要么那个目录有一个 package.cache 没有更新以反映新包。

可能导致 GHC 查找错误位置的一件事是机器上是否有多个 GHC:例如,如果 which ghc 显示 /usr/local/bin/ghc 那么您可能在某些时候从源代码编译了 GHC point 及其软件包占用了一些 /usr/local/lib/ghc-7.6.3/package.conf.d/ 文件夹,而您的存储库已安装 /usr/bin/ghc,它正在查找您想要的文件夹。

无论如何,修复:如果 package.cache 文件存在并且具有该文件的有效条目,那么您可以 运行 ghc -package-conf /path/to/package.cache ... 将这些包添加到您的可执行文件中。如果您还有其他问题,ghc -v ... 是调试 "which version of that package is being used here?" 类型问题的重要资源。

如果 package.cache 文件不存在,那么您遇到了更大的问题,可能最简单的方法是在 /home 下查找出现在 ghc-pkg list。将所需的包安装到该目录,即使 GHC 不理解这些更大的上下文,GHC 也应该选择它。您还可以开始使用项目的 cabal 本地包沙箱。

这里的情况与 C++ 类似,您有在动态链接阶段使用的库和用于编译的 header。在 Fedora 中,像 ghc-bytestring 这样的包只是没有 header 的库。要安装 headers,我必须安装 ghc-bytestring-devel 包。

Fedora 24 上的示例:

server.hs:7:8:
    Could not find module ‘Data.Text’
    Perhaps you meant Data.Set (from containers-0.5.5.1)
    Locations searched:
      Data/Text.hs
      Data/Text.lhs

所以更改为用户 root,然后:

有哪些套餐?

# dnf search ghc|grep text

ghc-text.x86_64 : An efficient packed Unicode text type
ghc-boxes.x86_64 : 2D text pretty-printing library
ghc-pango.x86_64 : Binding to the Pango text rendering engine
ghc-css-text.x86_64 : CSS parser and renderer
ghc-hgettext.x86_64 : Haskell binding to libintl
ghc-attoparsec.x86_64 : Fast combinator parsing for bytestrings and text
ghc-text-devel.x86_64 : Haskell text library development files
ghc-blaze-textual.x86_64 : Fast rendering of common datatypes
ghc-css-text-devel.x86_64 : Haskell css-text library development files
ghc-hgettext-devel.x86_64 : Haskell hgettext library development files
ghc-blaze-textual-devel.x86_64 : Haskell blaze-textual library development files

那么安装了什么?

# rpm --query ghc-text
ghc-text-1.1.1.3-3.fc24.x86_64

# rpm --query ghc-text-devel
package ghc-text-devel is not installed

所以让我们安装开发包。

# dnf install ghc-text-devel
Installed:
  ghc-text-devel.x86_64 1.1.1.3-3.fc24

...编译成功