2015-05-19 45 views
0

我试图在我的系统上运行hafka。而对于相同的元素类型,Data.ByteString.Internal.ByteString,由于版本号不匹配,haskell会引发错误。字节串 - 程序包版本号不匹配

Couldn't match expected type ‘bytestring-0.10.4.0:Data.ByteString.Internal.ByteString’ 
       with actual type ‘B.ByteString’ 
    NB: ‘bytestring-0.10.4.0:Data.ByteString.Internal.ByteString’ 
      is defined in ‘Data.ByteString.Internal’ 
       in package ‘bytestring-0.10.4.0’ 
     ‘B.ByteString’ 
      is defined in ‘Data.ByteString.Internal’ 
       in package ‘bytestring-0.10.6.0’ 

在我的系统,当我运行ghc-pkg list | grep bytestring,它表明, bytestring-0.10.4.0

ghc未使用版本为bytestring-0.14.0的软件包。 Haskell在哪里得到实际的版本 - bytestring-0.10.6.0

我还没有看到任何语言检查跨库版本的类型安全。为什么Haskell会这样做?

+0

您使用的是沙箱吗? 'ghc-pkg list'不会显示安装在沙盒中的软件包。 –

回答

3

这可能是你正在使用沙箱,在这种情况下,你可以看到这包是在与沙箱,例如,

cabal exec ghc-pkg list bytestring 

我还没有看到,检查任何语言在各种库版本中输入安全性为什么Haskell会这样做?

没有先验的理由相信,一个名为ByteString在包的一个版本类型是语义相同,在包的另外一个版本的同名类型。作为一个保守的规则,GHC根本不允许混合。请注意,检查这两种类型在语义上是否相同不仅限于查看其数据的表示形式;还需要比较它们的类型实例,这是一个明显不可解决的问题。人们可能会想,未来的GHC会试图在这方面做更多的分析,但它并不是一个迫切的需求 - 通常,简单地建立你的软件包对每个依赖关系的唯一版本并不困难。

+0

我运行了注释...它显示了两个条目,一个在$ HOME/.ghc中,另一个在/opt/ghc/7.8.4 /中......确切的输出是'/opt/ghc/7.8.4 /lib/ghc-7.8.4/package.conf.d bytestring-0.10.4.0 /home/sk/.ghc/x86_64-linux-7.8.4/package.conf.d bytestring-0.10.6.0 ' –