外部依赖,Haskell,堆栈:我应该修改一些东西还是'import'假设足够了?

Ser*_*bov 0 haskell dependency-management haskell-stack

我对Haskell和堆栈都很新.

import Data.Set
import Data.Stack
Run Code Online (Sandbox Code Playgroud)

上述语句触发编译错误:Could not find module 'Data.Set'. Perhaps you meant 'Data.Int'.我试图谷歌,发现没有类似的东西.

因此,我的问题是:我是否需要手动指定外部依赖项或仅仅是我的stack build命令,为什么无法从某个缓存或存储库中获取适当的模块?

如果我必须手动指定我的依赖项,我应该更喜欢.cabal.yaml?处理版本控制的正确方法是什么?

Xia*_*Shu 6

[Do]我需要手动指定外部依赖项[...]?

是.

由于您使用的是Stack,因此很容易指定您在代码中导入的依赖包.取决于您的堆栈版本,默认配置可能有点不同:

  1. 如果您使用最新版本的Stack创建项目,您将package.yaml在项目的根目录中看到(hpack在本例中用于指定配置).您需要在那里添加包依赖项,例如,containersfor Data.Set.以下是我的一个项目中依赖项部分的示例:

    dependencies:
    - base >= 4.7 && < 5
    - containers
    - time
    - network
    - bytestring
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您使用的是旧版本stack但未看到package.yaml,则需要进行编辑your-project-name.cabal以添加依赖项.以下是完整的文档,告诉您如何操作:https://docs.haskellstack.org/en/stable/GUIDE/#adding-dependencies

就个人而言,我更喜欢带有hpack(package.yaml)的新系统.基本上,它更简单,它可以节省您声明所有模块的时间(而不是依赖性).如果您有package.yaml,请不要编辑.cabal,这是由自动生成的hpack.