所有Haskell软件包是否都相互兼容?

时间:2012-06-04 02:07:34

标签: haskell libraries

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

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

所有这些包都是否相互兼容?如果我带来10个包来制作一个程序,它们一切都会好的。如果我带来了页面上列出的所有包裹怎么办?

想象一下,如果你使用Java,如果你带来了来自网络的10个jar,那么JAR之间可能存在依赖关系,这意味着一个JAR需要另一个JAR的版本对于不同的JAR来说,它不是一个好的版本。例如,一个JAR可能需要Hibernate 3.0.0版,另一个需要Hibernate 2.0.0。所以我不能使用这两个罐子因为他们不使用普通的Hibernate版本。

2 个答案:

答案 0 :(得分:6)

不,但是

  1. 包所有声明依赖项,包括版本范围
  2. 如果您使用cabal-install,它将尽最大努力保持一致。它在大多数时候都做得很好。由于依赖于旧版本,我无法获得构建软件,但我从未见过cabal被欺骗的情况。如果cabal为您安装包,它将会起作用;和cabal可能会为你安装包

答案 1 :(得分:6)

你在Haskell中遇到了同样的问题,尽管正如所指出的那样,Cabal在解决依赖关系时非常聪明。

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

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