3

我看到这里列出了很多 Haskell 包:

http://hackage.haskell.org/packages/archive/pkg-list.html#cat:database

所有这些软件包是否相互兼容?如果我为了制作一个程序而引入了 10 个包,它们都可以吗?如果我带了页面上列出的所有包裹怎么办?

想象一下,如果你在 Java 中,如果你从网络上引入 10 个 jar,那么在 Java 中,JAR 之间可能存在依赖关系,这意味着一个 JAR 需要另一个 JAR 的版本,而另一个 JAR 对不同的 JAR 来说不是一个好的版本。例如,一个 JAR 可能需要 Hibernate 3.0.0 版本,而另一个 JAR 需要 Hibernate 2.0.0。所以我不能使用这两个罐子,因为它们没有使用一个共同的相等的 Hibernate 版本。

4

2 回答 2

6

不是,但

  1. 包都声明依赖关系,包括版本范围
  2. 如果您使用 cabal-install,它将尽最大努力保持一切一致。大多数时候它都做得很好。由于对旧版本的依赖,我一直无法构建软件,但我从未见过阴谋集团被愚弄的情况。如果 cabal 为您安装软件包,它就会工作;cabal 可能会为您安装软件包
于 2012-06-04T02:37:12.943 回答
6

您在 Haskell 中遇到了同样的问题,尽管正如指出的那样,Cabal 在以最佳方式解决依赖关系方面非常聪明。

Cabal 会很高兴地安装一个包的多个版本,但是在创建自己的包时可能会导致一个微妙的错误:你的包可能间接依赖于多个版本(Cabal 在这样做时会警告你configure),这有一个微妙的惊喜:当你参考间接(例如通过类型推断)到一个类型,比如 State,它可能在一个地方被解析为 mtl 1.x,在另一个地方被解析为 mtl 2.x,两者不能统一。当您使用两个包并希望将它们组合到您的代码中时,这会成为一个问题。这很少是一个问题,但值得注意。

另请注意,Haskell 包通常依赖于版本范围而不是单个版本。这意味着 Cabal 构建了已接受版本的交集并使用其中的最新版本。

于 2012-06-04T03:08:11.450 回答