我看到这里列出了很多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版本。
答案 0 :(得分:6)
不,但是
答案 1 :(得分:6)
你在Haskell中遇到了同样的问题,尽管正如所指出的那样,Cabal在解决依赖关系时非常聪明。
Cabal会很高兴地安装一个软件包的多个版本,但是在创建自己的软件包时可能会出现一个微妙的错误:您的软件包可能间接依赖于多个版本(Cabal在执行configure
时会向您发出警告),有一个微妙的惊喜:当你间接地(例如通过类型推断)引用一个类型,比如State,它可能被解析为在一个地方mtl 1.x而在另一个地方mtl 2.x,并且这两个不能统一。当您使用两个包并希望在代码中将它们组合时,这就成了一个问题。它很少是一个问题,但值得注意。
另请注意,Haskell软件包通常依赖于版本范围而不是单个版本。这意味着Cabal构建了可接受版本的交集并使用其中的最新版本。