Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell GHC如何真正处理版本控制?_Haskell_Dependencies_Ghc_Cabal - Fatal编程技术网

Haskell GHC如何真正处理版本控制?

Haskell GHC如何真正处理版本控制?,haskell,dependencies,ghc,cabal,Haskell,Dependencies,Ghc,Cabal,我们——哈斯凯勒——可能都知道什么是阴谋集团地狱。当尝试升级我们的应用程序/库时,由于安装了不同的版本和不匹配的上限,我们会失败 我不明白。我检查过:GHC安装的包是版本连接的。这意味着,例如,当您安装mtl时,您有几个用于mtl的文件夹,每个安装的版本一个。这听起来不错,因为我们可以安装同一软件包的多个版本,并且根据.cabal中的上限,我们可以选择想要使用的版本 然而,在很多情况下,GHC不是这样工作的。如果您有上限,如mtl

我们——哈斯凯勒——可能都知道什么是阴谋集团地狱。当尝试升级我们的应用程序/库时,由于安装了不同的版本和不匹配的上限,我们会失败

我不明白。我检查过:GHC安装的包是版本连接的。这意味着,例如,当您安装
mtl
时,您有几个用于
mtl
的文件夹,每个安装的版本一个。这听起来不错,因为我们可以安装同一软件包的多个版本,并且根据
.cabal
中的上限,我们可以选择想要使用的版本

然而,在很多情况下,GHC不是这样工作的。如果您有上限,如
mtl<4.2
,则无法安装
mtl-4.2
或更高版本。我不明白为什么。为什么cabal/ghc不说“是的,我可以安装它,实际上它不会破坏任何东西,因为项目使用的是我已有的版本,所以我将继续使用该版本”

我想这有一个很好的原因,也许是因为并发版本。如果您使用的是
mtl-4.2
,并且依赖于使用
mtl-4.1
的软件包,那么您需要同时使用两个版本,这是不允许的。然而,GHC可以默认为较低版本,并允许在不破坏任何内容的情况下安装较高版本


关于这一点的另一点:如果这样做,我想对于很多版本来说,很难跟踪我们真正使用的版本。有办法检查吗?我有时会使用
-v3
标志来获取更多关于正在发生的事情的信息,但是像
cabal dep list
这样的东西会很棒。也许它已经存在于ghc pkg中了?

这个问题有很多子问题,但我会解决一个

它问:“关于这一点的另一点是:如果这样做,我想对于很多版本来说,很难跟踪我们真正使用的版本。有没有办法检查这一点?我有时使用-v3标志来获取更多关于正在发生的事情的信息,但是类似于cabal dep list的东西会很好。也许它已经存在于ghc pkg中?”


如果您在沙箱中运行,这个问题的其他元素似乎暗示您在运行,那么您可以调用
cabal sandbox hc pkg list
查看沙箱环境,通常在任何可能使用的地方使用
ghc pkg
来做其他可能使用
ghc pkg`但沙箱本地的事情。

算出这个例子:A依赖于B和C;B取决于D版本1.0;A将D的数据结构之一传递给C中的函数。正确的做法是什么?在这种情况下,确实是失败。但是我有很多共享版本,为什么阴谋集团不选择更高的通用版本?我不理解你最具体的例子(“然而,在很多情况下,…”)。您能否更明确地说明您是如何面对这个问题的?例如,ghc何时不允许您安装
mtl-4.2
;你的上限在哪里;你还依靠什么?在我的例子中,我想升级一个包,
monad-control
。我还依赖于
或者
单子日志
,两者都依赖于
单子控件
。我猜他们都比我使用相同的上限,也就是说,
我不久前问过同样的问题,得到了很好的答案。