我的理解是,当使用stack来编译一个项目时,不应该在.cabal(或package.yaml)文件中添加依赖项的版本约束,因为解析器会为您选择特定的版本。这包括GHC版本及其基本库。但是,当使用stack new
创建一个新项目时,它会自动向对base的依赖添加一个版本约束。
自动生成package.yaml的节选
dependencies:
- base >= 4.7 && < 5
为什么?
我不知道规范的答案。但这里有一个原因,为什么它可能是好的。
对于目前唯一现实的Haskell实现,即GHC,base
版本和编译器版本是密不可分的。这意味着合适的base
约束也传达了打算使用哪个版本的编译器。
后一部分是可以一目了然地了解一个包的有趣信息。
现在,栈解析器和GHC版本也是不可分割地联系在一起的。所以你可能认为这些信息已经可用了。但是目前,Hackage(大多数Haskell包被托管供其他人使用的地方)显示了从cabal文件中获取的一堆信息,但没有从堆栈文件中获取的信息。因此,如果您希望从包的自动生成的Hackage摘要中方便地获取有关GHC版本的信息,这是一种轻松而自动地做到这一点的方法。