我在使用 cabal 时遇到问题。我正在寻找使用 hackage 的 Data.Finite 包。
我运行了
cabal install finite-typelits-0.2.0.0
,我相信它成功了。我现在看到目录了.cabal/packages/hackage.haskell.org/finite-typelits
我想在我用 cabal 设置的库中使用这个包。该图书馆名为
haskell-scratch
。所以我将此包添加到 haskell-scratch.cabal
中,内容如下:
build-depends: base ^>=4.17.1.0,
finite-typelits
然后,当我在库中使用
cabal run
时,出现以下错误:
test/Main.hs:3:1: error:
Could not load module ‘Data.Finite’
It is a member of the hidden package ‘finite-typelits-0.2.0.0’.
Perhaps you need to add ‘finite-typelits’ to the build-depends in your .cabal file.
Use -v (or `:set -v` in ghci) to see a list of the files searched for.
|
3 | import Data.Finite
| ^^^^^^^^^^^^^^^^^^
如果我理解正确的话,这个错误告诉我我的项目无法看到新安装的包。然而,它建议的修复正是我所做的。
进一步放大我的困惑的是,当我使用emacs编辑文件
Main.hs
并使用haskell模式C-c C-l
时,我没有问题。我的Main.hs
看起来如下:
{-# LANGUAGE DataKinds #-}
module Main (main) where
import Data.Finite
main :: IO ()
main = putStrLn ("True maps to " ++ show (test True))
test :: Bool -> Finite 2
test True = 1
test False = 0
当我跑步时
C-c C-l
然后
λ> main
输出是预期的
Hello, Haskell! True maps to finite 1
所以我缺少一些关于阴谋集团的东西。我是 Haskell 新手,所以这可能是微不足道的。但是,对于我的一生,我似乎无法弄清楚它是什么。
提前致谢。
您可能没有将
build-depends
行包含在右侧的段落中。如果您尝试 cabal run
可执行文件 foo
,并且 foo
导入 Data.Finite
,那么您需要在 build-depends: finite-typelits
节中使用 executable foo
。
组件之间共享依赖关系是很常见的;如果你是这种情况,请查看 cabal 的
common
节,寻找减少重复的方法。
另外:依赖它之前不需要安装
finite-typelits
。 cabal
能够代表您从 Hackage 获取和构建依赖项,并且通常认为允许它是最佳实践; cabal install
应保留用于提供可执行文件。