Haskell GHC-7.6.2使用HashMap导出数据和可输入

时间:2013-09-27 16:23:44

标签: haskell deriving

升级到Ubuntu 13.10后,我的一个Haskell代码无法编译。以下代码在(至少)ghc-7.0.x下编译没有问题,但在ghc-7.6.2(使用unordered-containers-0.2.2.1)下失败:

{-# LANGUAGE OverloadedStrings, DeriveDataTypeable #-}
import Data.Typeable
import Data.Data
import qualified Data.HashMap.Strict as HM

data Bar = Bar { bar :: String } deriving(Data, Typeable)
data Foo = Foo { foo :: HM.HashMap String Bar } deriving(Data, Typeable)

我得到的错误是:

deriving-hm-fail.hs:7:58:
  No instance for (Data (HM.HashMap String Bar))
    arising from the 'deriving' clause of a data type declaration
  Possible fix:
    add an instance declaration for (Data (HM.HashMap String Bar))
    or use a standalone 'deriving instance' declaration,
         so you can specify the instance context yourself
  When deriving the instance for (Data Foo)

Data.HashMap.Strict具有实例声明:(数据k,数据v,Eq k,Hashable k)=>数据(HashMap k v)。由于Bar是Data的一个实例,这应该可行,或者我错过了什么?

2 个答案:

答案 0 :(得分:4)

它不仅应该工作, 在Linux上使用GHC 7.6.3 x86-64。也许这是一个7.6.2的bug?我会查看更改日志。

答案 1 :(得分:1)

经过实验,我发现Ubuntu 13.04附带的无序容器-0.2.2.1与ghc-7.6.2(也由Ubuntu提供)不兼容。当我从Hackage安装最新的无序容器时,它可以正常工作(但后来与其他软件包发生冲突)。

似乎Ubuntu发布的Haskell环境很糟糕。清除所有libghc- *软件包并从Hackage重新安装,修复了所有问题。