堆栈找不到下载的模块 (Data.MultiSet)



我一直在使用堆栈(在我的linux计算机中)来编译我的Haskell代码,今天我第一次安装了外部模块。我通过运行以下命令安装了 Data.MultiSet:

须藤栈安装多集

据说该模块已成功安装,但我无法加载它,当我尝试编译代码时,堆栈会抛出以下消息:

..错误: 找不到模块"数据.多集"...

我检查了我的.stack目录中包含的文件,有很多文件具有此包的名称,但我对这个目录树不是很熟悉。我还尝试在我的项目的 package.yaml 的依赖项字段中编写模块的名称,但它也没有用。有什么线索吗?谢谢!

堆栈不是那样工作的。Stack 背后的想法是这样的:你有一个项目,你知道这个项目的依赖关系,Stack 确保你总是可以构建这个项目——现在或将来。Stack不是以某种方式调整您的系统,让您此时此地访问某些软件包。

所以,如果你打算使用Stack进行开发(我个人不这样做,但我也不说这是一个坏主意;很多Haskellers都这样做),那么你应该首先设置你正在处理的文件作为项目的一部分。这可以像使您的文件成为堆栈代码段一样简单:将以下内容添加到文件顶部(我假设它被称为script.hs)

#!/usr/bin/env stack
{- stack --resolver lts-13.0 --install-ghc
runghc --package multiset
-}

(您也可以在命令行上传递这些标志以进行stack,但这很快就会变得乏味。env真的什么都不做,而是始终如一地。

然后使你的文件可执行- 在Linux或OSX上,这可以用chmod +x script.hs完成 - 编译和运行该脚本所需要做的就是./script.hs。(不是stack script.hsghc script.hs。这样做的好处是你可以得到"即时持续集成":如果Stack现在能够在你的计算机上构建运行你的脚本,你可以非常确定它将来也可以在任何其他计算机上工作,而无需记住要安装什么软件包等。

有关该技术的更多信息:https://www.fpcomplete.com/blog/2016/08/bitrot-free-scripts。

如果它不仅仅是你正在编写的简单脚本,你应该为它做一个适当的 Cabal/Stack 配置。这可以用cabal init轻松创建(无论你是使用阴谋集团还是堆栈)。

最新更新