3

升级到 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 有实例声明:(Data k, Data v, Eq k, Hashable k) => Data (HashMap kv)。由于 Bar 是 Data 的一个实例,这应该可以工作,还是我遗漏了什么?

4

2 回答 2

4

它不仅应该可以工作,而且可以在 Linux 上与 GHC 7.6.3 x86-64 一起工作。也许这是 7.6.2 的错误?我会查看更改日志。

于 2013-09-27T16:28:15.790 回答
1

经过一番试验,我发现 Ubuntu 13.04 附带的 unordered-containers-0.2.2.1 与 ghc-7.6.2(Ubuntu 也附带)不兼容。当我从 Hackage 安装最新的无序容器时,它可以工作(但它稍后会与其他包发生冲突)。

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

于 2013-09-28T09:11:27.913 回答